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? Почему-то мне кажется дело в нем.
А где MyInit находится и чего она делает? Непонятно с какого будуна WaitForSingleObject вешает всю систему.
все процедуры находятся в длл. В MyInit с помощью CoCreateInstance создается интерфейс IID_IShellWindows, далее я конэкчюсь к его событиям(IID_D*) и ставлю на них обработчики. после того как все обработчики стоят мне надо ждать уведомления о выходе, т.е. код должен стоять на месте, для этого я хотел использовать WaitForSingleObject, однако как только поток засыпает, обработчики тоже засыпают, и не приходят ответы на клики мышей по окнам, пропадает перерисовка и т.д. В МСДН пишут COINIT_MULTITHREADED Initializes the thread for multi-threaded object concurrency но в этом случае CoUninitialize не возвращает управление?! Я ниче не понимаю! Где можно почитать об этом?
Я так и подозревал что ты в shell влезаеш. Логика таких дел должна быть такая: - делаеш длл с сом объектом, который выставляет нужный тебе интерфейс - прописываеш в регистре свою длл (регистрируеш интерфейс) - сидиш и ждеш когда система соизволт вызвать твой обработчик Система сама должна управлять shell-ом. Почитай про shellext. Там можно много чего захучить.