Мой COM-клиент - консольное приложение, которое коннектится к COM-серверу и регистрируется для получения уведомлений о событиях. После вызова Код (Text): pConnectionPoint->Advise (&MySink, &dwSinkCookie); приложение-сервер наглухо виснет. Помучив аналог, созданный ATL Wizard'ом (нормально работающий), удалось установить, что собака каким-то образом зарыта в оконной процедуре, и пока не пойдет цикл обработки оконных сообщений, уведомления к MySink не пройдут. В итоге, такой код работает нормально: Код (Text): hr = pConnectionPoint->Advise (&MySink, &dwSinkCookie); MessageBoxA(0,"Hi!",0,0); Такой завешивает серверное приложение: Код (Text): hr = pConnectionPoint->Advise (&MySink, &dwSinkCookie); Sleep(INFINITE); То же и с getchar() - повисает. Вопрос - что делать, если клиент предполагается как безоконное приложение? //---------------------------------------------------------------------------------- UPD: Код (Text): MSG msg; while (GetMessage(&msg, (HWND) NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } Вместо MessageBox.
что значит "виснет" - оно делает что сказали, Sleep(INFINITIVE). Сделали бы как-то так: while (True) {Sleep(100)} чтоб временами просыпалось - не висло бы...
Весь код показывать не буду. Да, это простая консолька с main(). (Если что, там в конце первого поста работающий вариант и имхо CoInitializeEx тут никаким боком...)
Чорт! Все правильно! Код (Text): CoInitializeEx(NULL, COINIT_MULTITHREADED); Спасибо вам, уважаемый товарищ shchetinin!