在DLL中使用IXMLDocument需要CoInitialize?

时间:2015-12-17 14:44:40

标签: delphi winapi

使用CoInitialize(msxml包装器)时,是否有理由在我的DLL函数中使用IXMLDocument? (或其他com对象)

调用应用程序/线程是否负责调用CoInitialize/CoUninitialize

如果我在我的DLL中使用ComObj会自动调用其初始化部分中的CoInitialize并在其最终部分中调用CoUninitialize该怎么办?

1 个答案:

答案 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在可执行项目中初始化,但不在库中。