2014-10-24 3 views
0

Извините, мой английский навык очень низок.PostMessage(), SendMessage не работает в dll ATL (обработка событий)

Я делаю DLL ATL (C++). и обрабатывается 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; 
} 

ответ

0
  1. Даже если MSDN утверждает, что нет маршалинге WM_USER + x сообщений в кросс-процесс отправки, если мне не изменяет память правильно, вы, возможно, есть проблемы с кросс-нить отправки, а также. В этом случае используйте RegisterWindowMessage API для получения «sendable» WM_xxx идентификатор, а не harcoding его с помощью #define

  2. Не используйте голой CreateThread, используйте AtlCreateThread вместо (или, _beginthreadex). See why.

Еще одна причина, чтобы не получать сообщения на оконном нити нить тупиковый или создание окна на потоке, который не имеет сообщение насос позже, в обоих случаях сообщение не может быть отправлено, но нет диспетчерских его в окно , Вы также можете использовать инструмент Spy ++ (spyxx.exe в Visual Comment Comment \ Tools), чтобы убедиться, что соответствующее сообщение действительно отправляется в окно.

Смежные вопросы