delphi – 如何从库的角度处理COM(un)初始化?
通过阅读本网站上的几个答案,我学到了
CoInitialize(Ex) should be called by the creator of a thread.然后,在该线程中运行的任何代码都可以使用COM.如果该代码恰好自己调用CoInitialize(Ex),那将是无害的,因为它没有任何效果.它不应该调用CoUninitialize – 这也应该由线程的创建者完成 – 但如果它检查CoInitialize(Ex)的(保存的)结果将是S_FALSE则不会.如果创建者不负责执行初始化,则该线程处于该代码的“左右”以选择适当的线程模型,从那时起该模型将不可更改.
所有这些对于编写和使用库有什么影响? 当所有代码都是您自己的代码,并且您拥有一个小团队时,可以很好地组织COM(un)初始化调用.但是,对于库,用户不需要知道他们如何做他们做的事情,例如COM参与其中.我不想在文档中有什么可以在代码中处理.此外,除非涉及VCL代码,否则不应对库的代码运行的线程进行任何假设. 我检查过的大多数开源库都在初始化部分调用CoInitialize(Ex),在完成部分调用CoUninitialize,甚至不检查初始化是否成功.有些人调用了InitProc,但有些人首先检查了IsLibrary. 他们真的应该做什么?如果我自己写一个单元,我希望任何人都可以在没有多少考虑的情况下使用该怎么办?在线程中包装触及COM的所有内容并让该线程执行自己的COM(un)初始化? 与那些开源单位一样,它真的天真有多糟糕?在VCL应用程序中使用它们时,它们的COM(un)初始化将始终在主线程上运行,该主线程已经具有该performed first by 这是一个相当复杂的问题,但这一切都归结为:如何(容易)避免COM(un)初始化方面的麻烦? 解决方法
这很简单.记录您库的任何消费者必须初始化COM.这样做是完全可敬和平常的.将这样的要求放在图书馆的消费者身上真的没什么可担心的.如果他们不能做他们所??要求的,那就是他们的问题.正如您所指出的,线程的创建者必须负责初始化COM,因此您没有可行的替代方案.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |