アンマネージ 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