gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:08:15 25 4
gpt4 key购买 nike

使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com