c++ - 一个 C++ 客户端无法加载我们新注册的 COM .NET .dll,另一个可以

标签 c++ .net com regsvr32 regasm

我们有一个客户通过 COM 访问的旧 C/C++ .dll。

我们已尝试用一个新的 .NET 编写的 .dll 替换旧的 .dll。

客户无法重新编译他们的客户端,因此可以通过 COM 注销/注册新的(使用 regsvr32/regasm)简单地替换旧的 .dll 很重要。

我们相信我们已经构建了与旧版本具有相同 COM 接口(interface)的 .NET .dll; GUID、名称、dispid 等都匹配。我们已经通过编写自己的 C++ 测试应用程序验证了这一点,并且在我们注销旧的 .dll/注册新的 .dll 时它会继续工作。

问题是客户的客户端启动失败。

奇怪的是,如果我们让旧的 .dll 保持注册状态(例如,两个 .dll 都已注册)它会起作用;客户的应用程序启动并调用我们新 .dll 中的方法。但是一旦我们取消注册旧的 .dll,应用程序就无法再次启动。

我们尝试了不同的方式来注册新的.dll;将 regasm 与/codebase 选项、/tbl 等一起使用。

如果我使用 OLE/COM 查看器进行检查,我可以看到新旧 .dll 之间存在一些细微差别,例如类型库“名称”不同。但我想既然我们自己的 C++ 测试客户端可以与 .dll 一起工作,那么 COM 接口(interface)就足够相似了吗?

拜托,有人知道吗?一个 C++ 客户端如何加载我们的新 .dll 而另一个失败?如果我们让旧的 .dll 与新的并行注册,为什么两者都有效?是否有任何解释为什么两个 C++ 客户端的行为不同?


更新: 客户端中的错误消息说:

“运行时失败:CLSIDFromProgID。检查 [myDll].dll 是否已注册。”

亲切的问候P.T

最佳答案

有很多可能性。首先,确保您正在注册新 DLL 的类型库。旧的可能作为 DllRegisterServer 的一部分来做,但 AFAIK,.Net DLL 没有。用 REGTLB.exe 注册它。

还要检查两个 DLL 中的线程模型是否相同。

如果这些都没有帮助,我建议您继续,直到 OLEVIEW 说它们相同 - 您永远不知道客户在做什么,哪些与您的不同。

关于c++ - 一个 C++ 客户端无法加载我们新注册的 COM .NET .dll,另一个可以,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10538990/

相关文章:

c++ - 图库 API 设计

.net - 获取英语异常消息而不是本地语言

c# - 随机数生成器安全 : BCryptGenRandom vs RNGCryptoServiceProvider

c# - 如何在最小起订量中调试验证?

c# - 安装 OpenXML 文件转换器

linux - *nix 系统上是否有与 COM 等效的功能?如果不是,那么 *nix 的可重用性方法是什么?

c++ - 没有自定义删除器的空 unique_ptr 的析构函数是否微不足道

c++ - 为平台上可用的所有整数定义一个函数

c++ - C++代码中的奇怪运算符

powershell - 如何在Power Shell中将COM +服务器类型应用程序的标识设置为Network Service