0

私はこれに対する答えを探そうとしましたが、私が望むことは何もしません。

パッケージとして、または個別に使用できるDLLのセットを作成しています。アプリケーションがDLL-Bにもリンクしている場合、DLL-Aでの検出についてはどうすればよいですか?

アプリケーションは常に私が作成したものではなく、DLLだけが作成したものです。

DLL-Bがプログラムの一部であることを確認したら、2つのDLL間で通信できるようにしたいと思います。

これが意味をなさない場合は私に知らせてください、それは非常に夜遅くです:P

4

2 に答える 2

3

GetModuleHandle()パスを指定せずに、確認するDLLの名前で呼び出すだけです。を返す場合NULL、DLLはロードされません。それ以外の場合はロードされます。

次にGetProcAddress()、DLLハンドルと、呼び出したい関数の名前を使用して呼び出します。適切な関数ポインタ型にキャストして呼び出すことができる、その関数へのポインタを返します。

于 2013-01-30T15:41:36.423 に答える
0

DLLMainDLLがロードまたはアンロードされたときに呼び出される関数を作成する必要があります。

http://msdn.microsoft.com/en-gb/library/windows/desktop/ms682583(v=vs.85).aspx

BOOL WINAPI DllMain(HINSTANCE hinstDLL,
DWORD     fdwReason,
LPVOID    lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            /* Init Code here */
            break;

        case DLL_THREAD_ATTACH:
            /* Thread-specific init code here */
            break;

        case DLL_THREAD_DETACH:
            /* Thread-specific cleanup code here.
            */
            break;

       case DLL_PROCESS_DETACH:
            /* Cleanup code here */
            break;
    }
    /* The return value is used for successful DLL_PROCESS_ATTACH */
        return TRUE;

}

ここで、DLLがロードされたという事実を登録するために、デバイスの関数を呼び出す必要があります(NB上記の各スイッチケースの意味を確認し、適切に初期化してください)。正直に言うと、ほとんど何でもできますが、シングルトンを呼び出して、そこに登録(インターフェイスのインスタンスを作成しますか?)することもできます。

それができたら、やりたいことができるはずです。同じ方法で両方のDLLを登録すると、双方向通信が得られます。

注意:APIを提供している場合、ユーザーが「共有環境」をセットアップできるように、両方のDLLに共通の初期化呼び出しがあるとよいでしょう。

于 2013-01-30T15:31:33.427 に答える