Я хочу получить HWND в DLL ATL для функции SendMessage или PostMessage в Thread. но в ATL DLL нет окна.
Как получить HWND в DLL ATL?
Настройка приложения проекта: DLL (библиотека динамической компоновки), жизненный цикл разработки безопасности ('not' Support MFC)
Класс Вариант: Квартира, Агрегация Да, Двойной InterFace, Точки подключения.
HelloCtrl.cpp
(клиент VB обрабатывает ShowMessage())
STDMETHODIMP CHelloCtrl::ShowMessage(BSTR bstrCaption, VARIANT_BOOL* lpvbResult)
{
DWORD dwThreadID;
m_hThread_ReadData = CreateThread(NULL, 0, T_ReadData, (LPVOID)this, 0, &dwThreadID);
return S_OK;
}
DWORD WINAPI CHelloCtrl::T_ReadData(LPVOID pParam)
{
CHelloCtrl* hCtrl = (CHelloCtrl*) pParam;
::PostMessage(hCtrl->m_hWnd, WM_KEYDOWN, (WPARAM)NULL, (LPARAM)NULL);
return S_OK;
}
void CHelloCtrl::LeftButton()
{
Fire_OnMouseClick(123, 123);
}
HelloCtrl.h
#define WM_THREADFIREEVENT (WM_USER+1)
BEGIN_MSG_MAP(CHelloCtrl)
CHAIN_MSG_MAP(CComControl<CHelloCtrl>)
DEFAULT_REFLECTION_HANDLER()
MESSAGE_HANDLER(WM_THREADFIREEVENT, OnLeftButtonDown)
END_MSG_MAP()
public:
STDMETHOD(ShowMessage)(BSTR bstrCaption, VARIANT_BOOL* lpvbResult);
LRESULT OnLeftButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
void LeftButton();
private:
HANDLE m_hThread_ReadData;
static DWORD WINAPI T_ReadData(LPVOID pParam);
Окно - это объект, который может иметь или не иметь процесс или модуль, или он может при необходимости создать его. То есть, ваш вопрос не имеет ответа, не указывая, какое окно и его HWND
дескриптор вы ищете. DLL и HWND не связаны.
Из контекста, похоже, вы хотите окно, которое вы можете использовать для обмена сообщениями, и для передачи контроля выполнения между потоками. То есть, вы отправляете где-нибудь, а затем обрабатываете в другом месте, оставляя волшебство потоков для окна API.
В этом случае вы можете повторно использовать одно из существующих окон, например окно, созданное для элемента управления ActiveX, и вы просто создаете свое собственное окно, которое вы полностью контролируете и используете для своих целей. Для последнего вы получаете CWindowImpl
и... см. Реализация окна с CWindowImpl. Первое могло бы быть проще, может быть, не было: элементы управления ActiveX не должны иметь окна, в этом случае они являются элементами управления без окон. В то же время у вас есть возможность принудительно управлять окнами с помощью m_bWindowOnly
, см. Как мне получить HWND для элемента управления ActiveX после инициализации/активации элемента управления? ,