События COM/саспенд потока/оконная процедура

Тема в разделе "WASM.WIN32", создана пользователем _Juicy, 14 сен 2011.

  1. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Мой COM-клиент - консольное приложение, которое коннектится к COM-серверу и регистрируется для получения уведомлений о событиях.
    После вызова
    Код (Text):
    1. pConnectionPoint->Advise (&MySink, &dwSinkCookie);
    приложение-сервер наглухо виснет.
    Помучив аналог, созданный ATL Wizard'ом (нормально работающий), удалось установить, что собака каким-то образом зарыта в оконной процедуре, и пока не пойдет цикл обработки оконных сообщений, уведомления к MySink не пройдут.

    В итоге, такой код работает нормально:
    Код (Text):
    1.     hr = pConnectionPoint->Advise (&MySink, &dwSinkCookie);
    2.  
    3.     MessageBoxA(0,"Hi!",0,0);
    Такой завешивает серверное приложение:
    Код (Text):
    1.     hr = pConnectionPoint->Advise (&MySink, &dwSinkCookie);
    2.  
    3.     Sleep(INFINITE);
    То же и с getchar() - повисает.

    Вопрос - что делать, если клиент предполагается как безоконное приложение?

    //----------------------------------------------------------------------------------

    UPD:
    Код (Text):
    1.     MSG msg;
    2.     while (GetMessage(&msg, (HWND) NULL, 0, 0))
    3.     {
    4.         TranslateMessage(&msg);
    5.         DispatchMessage(&msg);
    6.      }
    Вместо MessageBox.
     
  2. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    что значит "виснет" - оно делает что сказали, Sleep(INFINITIVE).

    Сделали бы как-то так:

    while (True) {Sleep(100)}

    чтоб временами просыпалось - не висло бы...
     
  3. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Виснет сервер, т.к. он отправил сообщение и ждет ответа.

    Нет, этот вариант не работает.
     
  4. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    CoInitializeEx ?
     
  5. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Так... Чем она может помочь?
     
  6. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Squash
    Покажи код клиента, а так понял это тестовый так что по имеи должен быть только main.
     
  7. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Весь код показывать не буду. Да, это простая консолька с main().
    (Если что, там в конце первого поста работающий вариант и имхо CoInitializeEx тут никаким боком...)
     
  8. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Squash
    Если что это очень кривой костыль ...
     
  9. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Чорт!
    Все правильно!
    Код (Text):
    1.     CoInitializeEx(NULL, COINIT_MULTITHREADED);
    Спасибо вам, уважаемый товарищ shchetinin!