0

子dll(NPAPIプラグイン)をロードするActiveXdllがあります。私の子プラグインは複数のスレッドを作成し、それらはWebページに通信する必要があります。ActiveX(親dll)には、更新を提供するためにjavascriptのイベントを発生させる接続ポイントがあります。私が抱えている問題は、子が親DLLを呼び出す方法がわからないことです。

私が試したこと:1:クラス内になく、ActiveXクラス(this)へのポインターであるグローバル変数を使用した関数の子dllに関数ポインターを渡すが、E_UNEXPECTEDで呼び出すと接続ポイントが失敗する

2:子dllにクラス関数へのポインターを渡すと、同じ結果が得られます。

私はまだC++とCOMを同時に学んでいます、私の無知をお詫びします。ありがとうございました。

4

1 に答える 1

0

COMには、他のスレッドからCOMメソッドを呼び出すことができるように設定する方法がありますが、これを行う最も簡単な方法は、メインスレッドのActiveXコントロールにすべての呼び出しを戻すことです。これを行う1つの方法は、メッセージウィンドウを作成し、それにWindowsメッセージを投稿することです。LPARAMは、呼び出しを行うために必要なパラメーターを含むデータ構造へのポインターです。構造を作成して入力し、WINPROCが呼び出しを行った後、メッセージを投稿してメモリを解放します。

FireBreathはこのアプローチを使用しており、非常にうまく機能します。そういえば、ActiveXとnpapiの両方で機能するように、NPAPIプラグインをFireBreathプラグインとして実装することを検討しましたか?

役立つ可能性のあるコードサンプルを次に示します。

  • WinMessageWindow(.cpp.h)-これは、FireBreathがメッセージウィンドウを作成するために使用するクラスです。非同期(多くの場合クロススレッド)関数呼び出しの一部として使用されるDefaultWinProcに特に注意してください
  • NpapiBrowserHostAsyncWin(.cpp.h)-これは、npapiプラグインがNPN_PluginThreadAsyncCallが機能しないことを回避するために一部のブラウザーで使用されるクラスです。WinMessageWindowを利用して、_scheduleAsyncCallでクロススレッド呼び出しを行います

お役に立てば幸い

于 2012-05-17T04:03:19.903 に答える