【问题标题】:Using IXMLDocument inside a DLL needs CoInitialize?在 DLL 中使用 IXMLDocument 需要 CoInitialize?
【发布时间】:2015-12-18 00:05:46
【问题描述】:

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

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

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

【问题讨论】:

    标签: delphi winapi


    【解决方案1】:

    调用应用程序/线程是否负责调用 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 在可执行项目中初始化,而不是在库中。

    【讨论】:

    • 但是如果DLL使用的单元之一或DLL本身间接使用“ComObj”单元怎么办?如果有的话,我应该如何解决?
    • 这里更一般的规则是:COM 只能由线程的创建者/所有者初始化。如果 DLL 创建自己的线程来执行 COM 操作,它负责在这些线程上初始化 COM。
    • @zig 好吧,如果?完全没有问题。调用者按照指示初始化 COM。您的 DLL 可以使用 ComObj 中的函数。在 DLL 中使用 ComObj 不会导致 COM 被初始化。这只发生在 GUI 应用程序中。
    • @DavidHeffernan 查看 ComObj 的初始化部分。你是说初始化部分没有用到DLL?
    • 嗯,是的。如果不是 IsLibrary,则添加到 init procs 的代码受保护。随意在 DLL 中使用 ComObj 而无需初始化 COM。我知道我知道。
    猜你喜欢
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 2017-08-11
    • 1970-01-01
    相关资源
    最近更新 更多