delphi - 在 DLL 中使用 IXMLDocument 需要 CoInitialize?

标签 delphi winapi

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

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

如果我在 DLL 中使用 ComObj,它会在其初始化部分自动调用 CoInitialize 并在其最终确定部分调用 CoUninitialize

最佳答案

Is the calling application/thread responsible for calling 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 .

What if I use ComObj inside my DLL which automatically calls CoInitialize in its initialization section and CoUninitialize in its finalization section?

ComObj 单元不执行此操作。对于 DLL,您引用的 COM 初始化代码被抑制。包含 ComObj 将强制 COM 在可执行项目中初始化,但不在库中初始化。

关于delphi - 在 DLL 中使用 IXMLDocument 需要 CoInitialize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34337327/

相关文章:

delphi - 对 Delphi TMemo 中的每一行做一些事情

c# - 我怎样才能执行我的应用程序的单个实例?

c++ - 如何让 Windows 从应用程序进入休眠状态?

delphi - 如何将包含 TPngImage 的 TImage 保存为位图文件?

c++ - 将 HLOCAL 转换为 LPTSTR

c - 将 HANDLE 传递给 DLL

delphi - TTabSet 选项卡顺序...运行时与设计时不同

c++ - ListView 中的 Syslink

oracle - 没有安装 Oracle 客户端的 Delphi FireDac + Oracle

delphi - writeln (“:width” 说明符的明显副作用会导致输出中出现问号)