Кто отвечает за вызов CoInitialize и CoUninitialize, если суррогатный процесс или COM+

Кто отвечает за вызов CoInitialize и CoUninitialize, если

1- Я размещаю COM-dll в суррогатном процессе (либо с помощью утилиты dcomcnfg, либо с помощью мастера COM+)?

2- Я создаю ISAPI DLL, содержащую COM-объекты?


person arnold    schedule 23.03.2010    source источник


Ответы (1)


Понятия не имею о случае 2, но в случае 1 суррогатный процесс определенно вызывает CoInitialize()/CoUninitialize(). Вот откуда я это знаю.

У нас есть COM-объект, который мы размещаем в COM+ и который сам использует MS XML 4. Когда вам нужно создать объект XML-документа в MS XML 4, вы вызываете CoCreateInstance(). Мы никогда не вызываем CoInitialize() в нашем COM-объекте, тем не менее, создание документа всегда проходит успешно — конечно, суррогат вызывает CoInitialize(). Если мы сделаем то же самое в автономном приложении, создание документа завершится ошибкой, если мы сами не вызовем CoInitialize().

Итак, суть такова: суррогат COM+ (и я уверен, что это относится и к суррогату DCOM) сам вызывает CoInitialize().

Кстати, вы можете использовать это, чтобы исследовать случай 2 - вызов CoCreateInstance() внутри ISAPI dll - если он успешен, CoInitialize() уже был вызван.

person sharptooth    schedule 24.03.2010
comment
Спасибо за ответ. Есть ли у вас какие-либо идеи, присоединяется ли суррогат COM+ к STA или MTA? - person arnold; 24.03.2010
comment
@arnold: похоже, это зависит от модели обработки объектов COM: msdn.microsoft.com/en-us/library/ms681753(VS.85).aspx - person sharptooth; 24.03.2010