NVDA のデバッグビルド・リモートデバッグ環境で作業をしているのですが、 どうやら最近の NVDA のソースそのものが Windows 8.1 でデバッガと相性が悪く、 デバッガから実行すると高負荷のまま止まってしまい NVDA の初期化が終わりません。
いろいろ確認していて気付いたのですが、 Windows 8.1 64ビット+ Microsoft Windows ナレーターが動いている場合にも、 VoicePopper 3.12 が頻繁にクラッシュするようです。
引き続き調べてみます。
NVDA の隠し設定オプション UIA セクションで UIA を無効にするとこのクラッシュは回避できること、NVDA やナレーターが起動していなくても Windows SDK の Inspect で UI Automation の情報を調べようとするだけでクラッシュすること、などの状況から、本件はアプリケーション側の UI Automation 対応に起因する問題と思われます。
badUIAWindowClassNames による work around を試みましたが、有効な対策が見つかっていません。
Window よりも手前の段階で UIA を無効化する必要がありそうです。
チケットの種類を「サポートリクエスト」に、コンポーネントを「外部ツール」に変更します。
どうやら本家の最近の next ブランチでこの問題が解決しているようです。
環境:Voice Popper 3.12 + Windows 8.1 64ビット
ただ、本家版はその他の不具合があり実用的でないため、jpbranch に本家の next ブランチをマージしたテスト版を作りました。
日本語テスト版(アルファ系) jpalpha140208
https://dl.dropboxusercontent.com/u/62564469/nvda_jpalpha140208.exe
本家 next ブランチは開発中の作業が多いので、jpbeta 系(本家 master からのマージ)と比べると不安定です。
このスナップショットで VoicePopper の不具合がなさそうであれば、日本語チームとしては本件について独自の作業をせず、本家 master が安定するのを待つことにします。
もし本家 2014.1 で解決しなかったら、必要な変更を本家からチェリーピックして 2014.1jp で対応することも検討します。
なお、具体的に本家のどのブランチ作業が関係しているのか、まだ絞り込めていません。
3831 の効果を期待していたのですが、t3831 だけをマージしたバージョンでは解決しませんでした。
Don't handle most events from background processes by default http://community.nvda-project.org/ticket/3831
テスト版 jpalpha140218
https://dl.dropboxusercontent.com/u/62564469/nvda_jpalpha140218.exe
jpalpha140208 から jpbranch だけをマージしており、本家 next の更新はマージしていません。 この jpalpha 系では更新後も VoicePopper はクラッシュしません。
あいかわらず jpbeta系では本チケットの現象が解決していませんが、そろそろ差分が絞り込めてきました。
git diff jpbeta140218..jpalpha140218
本家のチケットで関係がありそうなものを挙げておきます:
http://community.nvda-project.org/ticket/3800
http://community.nvda-project.org/ticket/3801
jp2014.1 から ti33037v2 ブランチを作りました。
下記で 3800 をマージすると VoicePopper がフリーズしないようです。
git pull --no-commit origin t3800
この状態で改めてコミットして、下記のとおり push しました:
To ssh://git@bitbucket.org/nvdajp/nvdajp.git * [new branch] ti33037v2 -> ti33037v2
引き続き検証します。
日本語テスト版 jpbeta140223 https://dl.dropboxusercontent.com/u/62564469/nvda_jpbeta140223.exe
本家のチケット 3800 によると、この本家の作業はいくつか副作用が懸念されており、2014.1 には間に合わなさそうな感じです。
日本語版が独自にこの t3800 をマージしてよいか、判断が難しいところです。
また、このテスト版は Voice Popper 3.12 で使うと、Windows 8.1 64ビット環境でクラッシュはしませんが、メニュー項目を読み上げたり読み上げなかったりしています。
本件の対策を含むブランチ jpnext を jp2014.1 にマージします。
ただし jpbranch (本家 master に対応)にはマージせず、2014.2jp に向けて本家の t3800 関連作業を見守ることにします。
本家のチケット 3800 によると、現状の実装はすぐには不具合はないが、将来新しい作業(IE の UIA 対応)をするとき支障が出る可能性がある、とのことです。
本家チケット 3800 に関する追加作業が公開されたので、 git://git.nvaccess.org/nvda から abandoned-t3800 ブランチをマージしました。
To ssh://git@bitbucket.org/nvdajp/nvdajp.git 75e727b..4a3ddca ti33037v2 -> ti33037v2
ti33037v2 を 2014.1jp に採用するかどうか、もう少し検討します。
本家のコミットの詳細:
http://community.nvda-project.org/changeset/9961733cb3a89df53674e13fdeca6fb11837f12b
本家 abandoned-t3800 をマージすると VoicePopper 3.12 が Windows 8.1 x64 でクラッシュする現象が再発しました。
テスト用電子署名(selfcert)をして動作確認をしたところ、Windows 8.1 のスタート画面の読み上げで不具合が見つかりました。
日本語版 2013.3jp および本家版 2014.1 では問題がありません。
本家 t3800 の変更を取り除いたテスト版を作ったところ、以前のように矢印キーでスタート画面のタイルを読み上げるようになりました。
本件に関して t3800 をマージする手法での修正はリスクが高いようなので、いったん取り消します。
本件は 2014.2jp 以降に向けた検討課題とさせてください。
[jp2014.1 3d1ebac] reverted t3800 regarding ti33037 1 file changed, 66 deletions(-)
概要を「Voice Popper 3.12 が Windows 8.1 64ビット環境でクラッシュする」から「Voice Popper などが Windows 8/8.1 環境でクラッシュする」に変更します。
Windows 8 の 32bit版でもクラッシュすることがあるそうです。
本家が t3800 対応を再実装して 2014.2 に向けた next ブランチにマージしました。
本件への影響を再評価したいと思います。
本家が t3800 の新しい実装を破棄してチケット3800を wontfix にしました。
http://community.nvda-project.org/ticket/3800#comment:11
このチケットは本家の t3800 に期待していたので、いったんマイルストーン設定を解除します。
なお、当該ソフトウェアの最新版は NVDA の UI Automation を無効にすれば Windows 8 に対応するとしてリリースされました。
当該ソフトウェアは NVDA の UI Automation を無効にすれば Windows 8 に対応するとしてリリースされたので、 このチケットは「状態:直さない」としてクローズします。
おそらくは VB6 ランタイムと UIA の相性の問題で、 アプリケーション開発者が新しい開発環境に移行することが根本的な解決と思われます。
Windows 8.1 64ビット環境で NVDA 2013.3jp を実行中に、公開されているボイスポッパーの最新版であるバージョン Voice Popper 3.12 を起動して、メニューで上下矢印キーを押して項目移動していると、ボイスポッパーがクラッシュする現象を確認できました。
NVDA を実行していない場合はこの現象はおこりません。
また Windows 32ビット、Windows 7 以前のバージョンでも起こらないようです。
開発版をソースから実行すると NVDA のプロセス通信関連のモジュールがデバッガに引っかかるようなので、詳細を調査中です。
http://www.geocities.jp/katsuragi_nori/VoicePopper/