gpt4 book ai didi

c++ - COM dll注销问题

转载 作者:可可西里 更新时间:2023-11-01 09:44:56 25 4
gpt4 key购买 nike

我有一个包含许多 COM dll 的项目,为了满足要求,我必须注销一个 COM Dll,我通过调用 Regsvr32 -u 选项来注销该 dll。

这个注销操作似乎删除了一个接口(interface),比如 ICommon 接口(interface),这使得其他 COM 对象不可用。

ICommon 接口(interface)由所有其他COM 组件实现,在未注册的COM Dll 的注册表脚本中,我没有看到任何删除此ICommon 接口(interface)的代码表单注册表,如何删除它。

如何为给定的 CoClass 删除接口(interface)信息,BEGIN_COM_MAP 和 COM_INTERFACE_ENTRY 有什么作用吗?

最佳答案

COM 充斥着 DLL hell 问题。这里的故障模式是卸载服务器也会从 HKLM\Software\Classes\Interface 中删除 key 。它告诉 COM 应该使用哪个代理/ stub 实现来编码跨单元边界的接口(interface)。接口(interface)的 ProxyStubClsId32 键标识代理。

因此,这会破坏任何使用其他实现该接口(interface)的 COM 服务器的客户端程序,它们将无法再编码该接口(interface),并且它们将在运行时死于 E_NOINTERFACE。本身就是一个令人困惑的错误代码,您会假设接口(interface)不知何故消失了,但它实际上提示 COM 对象没有实现 IMarshal。 COM 在注册表中找不到 key 时的最后一口气。

这并不是说这通常很难修复,您只需重新注册失败的 COM 服务器,它就会将 key 放回原处。

对于这种丢失没有真正的防御措施,您必须实现一个精心设计的引用计数方案来记录有多少 COM 服务器依赖于代理并且只删除 key (和 DLL,如果它是一个自定义代理)倒计时到零时。这已经完成,但是只需要一个不接受该方案的安装程序,或者像您一样从命令行执行不明智的 Regsvr32.exe/u,就会使其失败。

关于c++ - COM dll注销问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24651681/

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