Re[2]: Непонятное поведение COM сервера
От: MaksymS Великобритания  
Дата: 12.01.02 13:26
Оценка:
Здравствуйте VladD2,

VD>Вызывай CoCreateInstance явно и поиграй с флагами (описание в MSDN).


Можно и так, но в конструкторе _com_ptr есть возможность и так управлять pOuter и CLSCTX. Просто эти параметры передаются как дополнительные.

В любом случае, поигрался я и с этим, и с CoInitializeEx — и выяснил, в чем дело. Логика работы COM в этом случае такова:

1) Ага, запрашиваемый сервер ("Outlook.Application") — не CLSCTX_INPROC_SERVER (не зарегистрирован как таковой).
2) Ага, запрашиваемый сервер — CLSCTX_LOCAL_SERVER.
3) Из 2 следует, что выполняться он должен в отличном от текущего процессе.
4) Из 3 следует, что нужно запустить новый процесс, в котором должен OleRun новый Local сервер.
5) Из логики запуска Outlook, который не дает запуститься более чем одной своей копии, запускается новый процесс, обнаруживает работающую копию и пытается передать ей управление — но работающая копия УЖЕ заблокирована вызовом CoCreateInstance.
6) ОБЛОМ.

Что интересно — Микрософт предусмотрела такую ситуацию и создала еще один интерфейс IOutlookExtCallback, который можно получить из стандартного IExchExtCallback, и который, собственно, должен возвращать требуемый IUnknown и IDispatch. Но интерфейс этот явно в MSDN не документирован, нигде в хедерах не упоминается, а есть только короткое его упоминание в статье "Microsoft Outlook and Exchange Client Extensions", которая опубликованна в MSDN. Один раз.

Потестировать код для его использования я еще не успел, но если кому будет интересен сей опыт, то добро пожаловать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.