0

アンマネージ C++ DLL に以下のコードがあります。ToasterHook() 関数は、P/Invoke を使用して C# アプリによって呼び出され、WM_COPYDATA メッセージをトラップするために WndProc がオーバーライドされます。Process Explorer は、私の DLL が他のプロセスに挿入されたと表示しますが、フォームがロードされたときに WM_COPYDATA を 1 回しか受信していません。

#pragma data_seg (".SHARED")
HHOOK g_HookHandle = 0;
HINSTANCE DllHandle; 
HOOKPROC hkprcSysMsg;
#pragma data_seg()


extern "C" __declspec(dllexport) int ToasterHook()
{
    if(g_HookHandle != 0) return 0;
    DllHandle = LoadLibrary(L"toasterHookDll.dll");
    hkprcSysMsg = (HOOKPROC)GetProcAddress(DllHandle, "_ToasterInterProcFilter@12");
    g_HookHandle = SetWindowsHookEx(WH_SHELL, hkprcSysMsg, DllHandle, 0);
    return 0;
}

extern "C" __declspec(dllexport)
LRESULT CALLBACK ToasterInterProcFilter(int code, WPARAM wParam, LPARAM lParam)
{
    if(code == HSHELL_WINDOWCREATED) {
        HWND g_ToasterReceiver = FindWindow(NULL, L"toaster");
        SendNotifyMessage(g_ToasterReceiver, WM_COPYDATA, wParam, lParam);
    }
    return CallNextHookEx(g_HookHandle, code, wParam, lParam);
}

extern "C" __declspec(dllexport) void ToasterUnHook()
{
    if(g_HookHandle == 0) return;
    UnhookWindowsHookEx(g_HookHandle);
}

ここで何が間違っていますか?HOOKPROCにGetProcAddress(DllHandle, "_ToasterInterProcFilter@12")nor自身の結果を指定するとうまくいくようです。ToasterInterProcFilter

4

1 に答える 1

1

WM_COPYDATAメッセージを送信する場合、lParam値は構造体を指している必要がありCOPYDATASTRUCTます。このデータ構造には、コピーするデータへのポインタやデータのサイズなどの情報が含まれています。Windows は、このデータのマーシャリングを自動的に処理して、メッセージを受信するアプリケーションからアクセスできるようにします。

あなたのコードは現在、lParam付随するHSHELL_WINDOWCREATED. Windows が指すデータをCOPYDATASTRUCT構造として解釈できる可能性はありますが、ほとんどの場合、失敗します。

于 2013-06-23T15:39:34.753 に答える