Пауза после инициализации com

Тема в разделе "WASM.WIN32", создана пользователем Android, 12 ноя 2005.

  1. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    MyProc proc lParam:dword

    invoke CoInitialize,0

    invoke MyInit



    ;здесь мне надо остановиться и ждать определенного события для выхода



    invoke MyUninit

    invoke CoUninitialize

    ret

    MyProc endp

    В процедурах MyInit и MyUninit соответственно ставятся и снимаются обработчики событий ком объктов.



    Вопрос:

    Как можно реализовать ожидание? Пробовал WaitForSingleObject - виснит вся система, как будто она тоже "засыпает" вместе с текущим потоком (или обработчики выполняются в этом потоке?).

    Если вызвать MessageBox, то все работает вроде бы нормально при условии, что сообщение о выходе из MB посылается из другого процесса, т.е. если послать сообщение, например, из другого потока текущего процесса, то процедура CoUninitialize не возвращает управление, а если из другого процесса - возвращает...

    Вот такие вот пирожки с котятами!

    Почему так происходит? И как реализовать задержку?

    Может надо использовать CoInitializeEx, видел там флаг COINIT_MULTITHREADED? Почему-то мне кажется дело в нем.
     
  2. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    А где MyInit находится и чего она делает? Непонятно с какого будуна WaitForSingleObject вешает всю систему.
     
  3. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    все процедуры находятся в длл. В MyInit с помощью CoCreateInstance создается интерфейс IID_IShellWindows, далее я конэкчюсь к его событиям(IID_D*) и ставлю на них обработчики. после того как все обработчики стоят мне надо ждать уведомления о выходе, т.е. код должен стоять на месте, для этого я хотел использовать WaitForSingleObject, однако как только поток засыпает, обработчики тоже засыпают, и не приходят ответы на клики мышей по окнам, пропадает перерисовка и т.д. В МСДН пишут COINIT_MULTITHREADED

    Initializes the thread for multi-threaded object concurrency

    но в этом случае CoUninitialize не возвращает управление?!

    Я ниче не понимаю!

    Где можно почитать об этом?
     
  4. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    Я так и подозревал что ты в shell влезаеш. Логика таких дел должна быть такая:

    - делаеш длл с сом объектом, который выставляет нужный тебе интерфейс

    - прописываеш в регистре свою длл (регистрируеш интерфейс)

    - сидиш и ждеш когда система соизволт вызвать твой обработчик



    Система сама должна управлять shell-ом. Почитай про shellext. Там можно много чего захучить.
     
  5. Android

    Android New Member

    Публикаций:
    0
    Регистрация:
    24 авг 2003
    Сообщения:
    183
    Адрес:
    Ukraine
    Ответ на этот вопрос тут