CoInitialize
在使用IXMLDocument
(msxml包装器)时,是否有理由在我的DLL函数中使用?(或其他com对象)
调用应用程序/线程是否负责调用CoInitialize/CoUninitialize
?
如果我ComObj
在我的DLL中使用它CoInitialize
在其初始化部分和CoUninitialize
其终结部分中自动调用该怎么办?
调用应用程序/线程是否负责调用CoInitialize/CoUninitialize?
是.作为一般规则,线程的创建者必须负责初始化COM.这意味着从DLL公开的函数不应该为调用它们的线程初始化COM.
原因是,如果你把在调用该DLL的线程,初始化COM责任则该地方的不合理限制在该线程的创建者.如果线程的创建者需要执行另一个需要初始化COM的操作,该怎么办?标准做法是DLL指定COM初始化作为其要求之一.在DLL的文档中,声明调用者必须初始化COM.
这里有更多细节:你不应该做的事情,第2部分:Dlls不能在应用程序的线程上调用CoInitialize*.
这就是为什么你不应该在调用者的线程上初始化你的DLL中的COM.还有更多的理由不在初始化部分初始化COM.初始化部分在DLL内部执行DllMain
.您可以在内部调用很少的东西DllMain
,COM函数不在允许的操作列表中.更多细节:在你的DllMain中没有做任何可怕事情的一些原因,第3部分.
如果我在我的DLL中使用ComObj,它在其初始化部分自动调用CoInitialize并在其终结部分中自动调用CoUninitialize,该怎么办?
该ComObj
单位不这样做.对于DLL,将引用您引用的COM初始化代码.包括ComObj
将强制COM在可执行项目中初始化,但不在库中.