PostMessage(),SendMessage 在 ATL dll 中不起作用(事件处理)



对不起,我的英语水平很低。

我制作了一个ATL(C++(dll.并由VB处理。我在基本代码下制作。

WaitAndReadData,Thread_WaitAndReadData正在工作。

但是,::SendMessage, ::P ostMessage 在 Thread_WaitAndReadData 或 WaitAndReadData 中不起作用。和断点在Get_Data_Messagehandler中不起作用。(+ 另一个函数调用。

#define WM_SERVERTHREADFIREEVENT (WM_USER+2)
BEGIN_MSG_MAP(CHello)
CHAIN_MSG_MAP(CComControl<CHello>)
MESSAGE_HANDLER(WM_SERVERTHREADFIREEVENT, GetData_Messagehandler)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()

-

static DWORD WINAPI Thread_WaitAndReadData(LPVOID pParam)

-

STDMETHODIMP CHello::WaitAndReadData(BSTR* ret_Result)
{
    // TODO: Add your implementation code here
    DWORD dwThreadID;
    thread = CreateThread(NULL, 0, Thread_WaitAndReadData, (LPVOID)this, 0, &dwThreadID);
    return S_OK;
}

-

DWORD WINAPI CHello::Thread_WaitAndReadData(LPVOID pParam)
{
CHello* hello = (CHello*)pParam;
::SendMessage(hello->m_hWnd, WM_SERVERTHREADFIREEVENT, (WPARAM)NULL, (LPARAM)NULL);
return S_OK;
}

-

LRESULT CHello::GetData_Messagehandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
MessageBox(L"GetData_Messagehandler", L"asd", MB_OK);
return 0;
}
  1. 尽管 MSDN 声明在跨进程发送中没有对WM_USER + x消息进行封送处理,但如果我没记错的话,您可能也会遇到跨线程发送问题。在这种情况下RegisterWindowMessage使用 API 获取"可发送"WM_xxx标识符,而不是使用#define对其进行编码

  2. 不要使用裸CreateThread,改用AtlCreateThread(或_beginthreadex(。看看为什么。

在窗口线程上

不接收消息的另一个原因是线程死锁或在以后没有消息泵的线程上创建窗口,在这两种情况下,都可能发送消息,但没有将其调度到窗口。您还可以使用 Visual Studio Comment\Tools 目录中的 Spy++ 工具 (spyxx.exe( 来确保相关消息确实被发送到窗口。

最新更新