使用CoInitialize
(msxml包装器)时,是否有理由在我的DLL函数中使用IXMLDocument
? (或其他com对象)
调用应用程序/线程是否负责调用CoInitialize/CoUninitialize
?
如果我在我的DLL中使用ComObj
会自动调用其初始化部分中的CoInitialize
并在其最终部分中调用CoUninitialize
该怎么办?
答案 0 :(得分:8)
调用应用程序/线程是否负责调用CoInitialize / CoUninitialize?
是。作为一般规则,线程的创建者必须负责初始化COM。这意味着从DLL公开的函数不应该为调用它们的线程初始化COM。
原因是如果你负责在调用DLL的线程中初始化COM,那么就会对该线程的创建者施加不合理的约束。如果线程的创建者需要执行另一个需要初始化COM的操作,该怎么办?标准做法是DLL指定COM初始化作为其要求之一。在DLL的文档中,声明调用者必须初始化COM。
此处有更多详情:Things you shouldn't do, part 2: Dlls can't ever call CoInitialize* on the application’s thread。
这就是为什么你不应该在调用者的线程中初始化DLL中的COM的原因。还有更多的理由不在初始化部分初始化COM。初始化部分在DLL DllMain
内执行。您可以在DllMain
内调用很少的东西,COM函数不在允许的操作列表中。有关详细信息:Some reasons not to do anything scary in your DllMain, part 3。
如果我在我的DLL中使用ComObj,它在其初始化部分自动调用CoInitialize并在其终结部分中自动调用CoUninitialize,该怎么办?
ComObj
单位不这样做。对于DLL,将引用您引用的COM初始化代码。包括ComObj
将强制COM在可执行项目中初始化,但不在库中。