gpt4 book ai didi

delphi - 如何从库的角度处理 COM(未)初始化?

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

通过阅读该网站上的几个答案,我了解到 CoInitialize(Ex) should be called by the creator of a thread 。然后,在该线程中运行的任何代码都可以使用 COM。如果该代码碰巧调用 CoInitialize(Ex)就其本身而言,这将是无害的,因为它不会产生任何影响。它不应该调用 CoUninitialize – 这也应该由线程的创建者完成 – 但如果它检查 CoInitialize(Ex) 的(保存的)结果,则不会这样做这将是 S_FALSE 。如果创建者不负责执行初始化,则线程将由该代码“摆布”来选择适当的线程模型,从那时起该模型将无法更改。

这一切对编写和使用库有什么影响?

当所有代码都是您自己的并且您有一个小团队时,可以很好地组织 COM(取消)初始化调用。然而,对于库,用户不需要知道他们是如何做他们所做的事情的,例如COM 参与其中。我不想在文档中包含可以在代码中处理的内容。另外,除非涉及 VCL 代码,否则不应假设库代码将在哪个线程中运行。

我检查过的大多数开源库都调用 CoInitialize(Ex)initialization部分和 CoUninitializefinalization节,通常甚至不检查初始化是否成功。有人调用InitProc相反,还需要先检查IsLibrary .

他们真正应该做什么?如果我自己编写一个单元,我希望任何人都可以不加考虑地使用它,该怎么办?将所有涉及 COM 的内容包装在一个线程中,并让该线程执行自己的 COM(取消)初始化?

像那些开源单位那样天真地对待它真的有多糟糕?当在 VCL 应用程序中使用它们时,它们的 COM(未)初始化将始终在主线程上运行,该主线程已经具有 performed first by Forms.TApplication.Create 。这是否会使单位中的调用变得无辜但毫无用处?如果 .dpr 中列出了任何单位,该怎么办?之前Forms ?非 VCL 应用程序或 DLL 怎么样?在纠正这些单位之前我不应该使用它们吗?我是否应该通过始终预防性初始化 COM 来防止他们可能尝试做的事情?

这是一个相当复杂的问题,但归根结底是:如何(使其变得容易)避免 COM(取消)初始化方面的麻烦?

最佳答案

这很简单。记录您的库的任何使用者都必须初始化 COM。这样做是完全受人尊敬且司空见惯的。对图书馆的使用者提出这样的要求确实没有什么可担心的。如果他们没有按照要求去做,那就是他们的问题。正如您所指出的,线程的创建者必须负责初始化 COM,因此您没有可行的替代方案。

关于delphi - 如何从库的角度处理 COM(未)初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41498446/

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