我在非托管C ++ DLL中有以下代码。 ToasterHook()函数由C#app使用P / Invoke调用,并且重写WndProc以捕获任何WM_COPYDATA消息。 Process Explorer说我的DLL已经注入到其他进程中,但是我只在表单加载时收到WM_COPYDATA。
#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")
和ToasterInterProcFilter
本身的结果似乎正在起作用。
答案 0 :(得分:1)
发送WM_COPYDATA
消息时,lParam
值必须指向COPYDATASTRUCT
结构。该数据结构包含诸如指向要复制的数据的指针和数据大小的信息。 Windows会自动处理这些数据的编组,以便接收消息的应用程序可以访问它。
您的代码目前正在通过lParam
附带的HSHELL_WINDOWCREATED
。 Windows可能会将其指向的数据解释为COPYDATASTRUCT
结构,但在大多数情况下,它会失败。