DrHex, а ты вежливый.
В общем, сделал следующим образом: в ответ на определенную команду сервис создает поток, в котором создается окно
Код | LRESULT CALLBACK clUpdater::WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch(msg) { case WM_USER + 1: { dpService::cLog->Write("%s", "Yuppiiiii!!!!!!"); } break;
case WM_DESTROY: PostQuitMessage(0); break;
default: break; }
return(DefWindowProc(hwnd, msg, wparam, lparam)); }
void __cdecl clUpdater::UpdaterThread(void *arg) { clUpdater *self = static_cast<clUpdater *>(arg);
MSG msg;
self->_hwnd = CreateWindowEx(NULL, UPDATE_WINDOW_CLASS, "MW", WS_POPUP, 0, 0, 0, 0, NULL, NULL, g_hInstance, NULL); if(!self->_hwnd) { self->_bIsStarted = false; SetEvent(self->_evnt); return; }
self->_bIsStarted = true; SetEvent(self->_evnt);
while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } }
void clUpdater::Start() { this->Clear();
_evnt = CreateEvent(0, FALSE, FALSE, "clUpdater::Start");
long int tid = _beginthread(clUpdater::UpdaterThread, 0, (void *)this); if(tid == -1) { CloseHandle(_evnt); throw CharException("%s", TXT_CANNOT_START_UPDATER_THREAD); } WaitForSingleObject(_evnt, INFINITE); CloseHandle(_evnt);
if(!_bIsStarted) throw CharException("%s", TXT_CANNOT_START_UPDATER);
SendMessage(_hwnd, WM_USER + 1, 0, 0);
_hTid = (HANDLE)tid; }
|
пробовал запустить сей код под XP и под Вистой. На обеих операционках в лог пишется строка "Yuppiiiii!!!!!!", что говорит о том, что окно создается и получает сообщение WM_USER + 1. |