Кто отвечает за вызов CoInitialize и CoUninitialize, если
1- Я размещаю COM-dll в суррогатном процессе (либо с помощью утилиты dcomcnfg, либо с помощью мастера COM+)?
2- Я создаю ISAPI DLL, содержащую COM-объекты?
Кто отвечает за вызов CoInitialize и CoUninitialize, если
1- Я размещаю COM-dll в суррогатном процессе (либо с помощью утилиты dcomcnfg, либо с помощью мастера COM+)?
2- Я создаю ISAPI DLL, содержащую COM-объекты?
Понятия не имею о случае 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()
уже был вызван.