2009-07-20 23 views
2

スレッドが開始または終了したときに通知されるオブジェクトA(A :: Notify()メソッド)があります。
このスレッドは、私のDLLファイルを動的にロードします(私はそれを書くことができます)。
私はこのDLLのdllMain関数を書く必要がありますが、私はNotify()メソッドを実行できるようにこの関数からAオブジェクトへの参照を取得する方法がわかりません。
アイデア?スレッドが起動したときにオブジェクトに通知する

+0

さらに正確に言えば、あなたの質問を読んでいるようですが、 "通知する"部分はdllの読み込みとは無関係です。これが本当であれば、あなたのスレッドクラスはA :: notify()を呼び出さなければなりません(A:DIPへの参照を与えて)、DLLをロードしてください。 – neuro

答えて

0

A::Notify()を静的メソッドにすることはできますか? それ以外の場合は、Singletonメソッドが目的を果たす可能性があります。

0

メインプログラムでは、クラスAのインスタンスがあります。メインプログラムが特定のDLLをロードするときに、そのインスタンスに対してA :: Notifyを呼びたいと思っていますか?

私が知っている限り、LoadLibraryに追加の引数を渡す方法はありません。

A :: Notifyが静的である場合、またはAがシングルトンの場合、exeファイルから "NotifyA"メソッドをエクスポートし、LoadLibrary( "yourexe")を呼び出すとGetProcAddressが呼び出され、NotifyAそれを呼び出すことができます。 (はいのexeファイルは、DLLのようなメソッドをエクスポートすることができます!)

二番目のオプションは、独自のLoadLibraryを書くことで、DLLの初期化メソッドは、その後、保存することができます例えば

HMODULE MyLoadLibrary(string dll, A *a) 
{ 
    HMODULE module = LoadLibrary(dll.c_str()) 
    void (call*)(A*) = void (*)(A*)GetProcAddress(module, "Init"); 
    call(a); 
    return module; 
} 

、DLLのメイン後に第2のメソッドを呼び出すこと後で使うインスタンス。

+0

私はAオブジェクトがDLLにないと思いますか? – neuro

1

DLLはすべてのプロセスで1回ロードされます。ロードされると、プロセスでスレッドが作成されるたびにそのDllMainが自動的に呼び出されます。 Aは、グローバル変数であると仮定すると、次のことができます。あなたが最初のDLLをロードした後

  1. は、DLL内にグローバルポインタを設定しますエクスポートされた関数を呼び出したDllMainを使って呼び出されるたび
  2. スレッドがアタッチされている理由は、DLLにあるポインタを介してAを呼び出します。

また、exeでメッセージループを開始し、スレッドIDをDLLに渡すこともできます。次に、スレッドがDLLに接続するたびに、メッセージループに、作成されたスレッドの詳細を示すメッセージを送信します。これはもう少し複雑な解決策ですが、DLLをAクラスに慣れさせる必要がありません。

関連する問題