0

ファイルを選択する方法を提供する FireFox 用のプラグインを作成しました。このメソッドは、Win API 関数を呼び出しますGetOpenFileName。ダイアログ「ファイルを開く」が表示され、他のウィンドウに切り替えない場合、すべて正常に動作します。ブラウザ ウィンドウをクリックするとすべてがブロックされ、しばらくするとプラグインがクラッシュしたというメッセージが表示されます。この問題は FireFox でのみ発生し、Chrome と Safari では発生しません。GetOpenFileName独自のメッセージループを持っているという事実と関連していると思います。この動作を修正する簡単な方法はありますか?

たとえば、関数SHBrowseForFolderは FireFox で正常に動作します。

FireFox のソースには、おそらくこの問題を解決できるクラスMessageLoopとメソッドSetNestableTasksAllowed()があります (少なくとも、ヘッダーの説明からこの結論を得ることができます)。しかし、 xulrunner-sdk-13.0.1 には、MessageLoopfunction を持つ xul.lib がありますが、 class を持つヘッダーはありませんGetIOMessageLoop。おそらく、FireFox ソースからヘッダーを取得することは可能ですが、VS 2010 のプロジェクトでそれらを使用するのは簡単ではないと思います

4

1 に答える 1

1

ここで理解しておく必要がある主なことは、NPAPI プラグインでメイン スレッドをブロックしてはならないということです。あなたが話している関数はすべてブロッキング呼び出しであるため、メインスレッドでそれらを使用しないでください。

それらを別のスレッドで呼び出すと、問題は解決するはずです。これを行うときは、おそらくコールバック関数が必要になることに注意してください (JavaScript 関数は、InvokeDefault を呼び出すことができる NPObject として入ります)。また、メインスレッドでのみ NPN_InvokeDefault を呼び出すことができるため、メインスレッドでコールバックを行う方法。

于 2012-11-08T03:43:38.830 に答える