我有一个共享DLL,我想将HWND写入全局共享部分:
#pragma data_seg(".SHARED")
HWND g_shhWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.SHARED,RWS")
进程1加载DLL(LoadLibrary)并从DLL调用MainLoop,等待WM_QUERYWND。收到后,它会将自己的HWND写入全局共享变量g_shhWnd。
extern "C" __declspec(dllexport) MainLoop()
{
// contains huge bunch of stuff: creates a window, message loop & window handler
// window handler contains:
case WM_QUERYWND:
g_shhWnd = myCurrentWnd;
// ...
}
进程2加载DLL LoadLibrary)并调用GetMyWnd():
extern "C" __declspec(dllexport) HWND GetMyWnd()
{
UINT WM_QUERYWND = RegisterWindowMessage(WM_QUERWND_GUID);
SendMessage(HWND_BROADCAST, WM_QUERWND, 0, 0);
return g_shhWnd;
}
此函数使用WM_QUERWND,使进程1将当前HWND写入g_shhWnd。实际上进行了此调用,并且g_shhWnd实际上由进程1写入(通过MessageBox检查)。
但是,进程2中GetMyWnd的返回值始终为零(当然,在SendMessage返回后,g_shhWnd为零)。
我希望g_shhWnd在此DLL中存在的所有实例中共享。
是否有任何遗漏或如何进行调试?