Здравствуйте VladD2, вы писали:
VD>Почитай вот это http://www.optim.ru/cs/2000/4/com_htm/com_2.asp
Спасибо! — натолкнуло на мысли и эксперементы. Оказалось:
— можно сделать cancel сообщения в ATM, если добавить IMessageFileter::MessagePending и возвращать из него после timeout'а PENDINGMSG_CANCELCALL, но так как MessagePanding вызывается, только тогда когда приходит Windows сообщение, то полезно перед COM-вызовом сделать ::SetTimer(wnd, timeout), что-бы сообщение точно пришло, а то опять будет весеть до бесконечности, особенно если это проиходит в нитке не связанной с видимым окном
— нашел у MS следующие рассуждения
http://msdn.microsoft.com/library/en-us/com/hh/com/asyncall_8yur.asp?frame=true , из которых следует что CoCancelCall более общий способ прерывать COM-вызовы — он работает для любой модели, в то время как IMessageFileter только для ATM
— вернулся обратно к эксперементу с CoCancelCall — оказалось, что я был рядом. Выяснилось, что для того что-бы прервать COM команду, надо вызвать CoCancelCall пару раз, кстати такое же наблюдалось с IMessageFileter::MessagePending. Надо полагать, при удаленном вызове есть какая-то внутреняя вложенность вызовов. После того как watchdog нитка стала многократно вызывать CoCancelCall — вызовы стали успешно прерываться. Так что проблема решена
Всем спасибо!