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

时间:2014-10-24 05:24:39

标签: c++ visual-studio event-handling atl

抱歉,我的英语技能非常低。

我创建一个ATL(C ++)DLL。并由VB处理。 我根据基本代码制作。

WaitAndReadData,Thread_WaitAndReadData正在运行。

但是,:: SendMessage,:: PostMessage在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 个答案:

答案 0 :(得分:0)

  1. 尽管MSDN声明在跨进程发送中没有WM_USER + x消息的编组,但如果我的内存对我有用,那么您也可能遇到跨线程发送问题。在这种情况下,使用RegisterWindowMessage API获取&#34; sendable&#34; WM_xxx标识符,而不是使用#define

  2. 对其进行编码
  3. 不要使用裸CreateThread,而是使用AtlCreateThread(或_beginthreadex)。 See why

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