一个C ++客户端无法加载我们的新COM注册.NET .dll,另一个工作

时间:2012-05-10 17:08:25

标签: c++ .net com regsvr32 regasm

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

我们试图用一个用.NET编写的新文件替换旧的.dll。

客户无法重新编译其客户端,因此只需通过COM取消注册/注册new(使用regsvr32 / regasm)即可替换旧的.dll。

我们相信我们已经使用与旧版本相同的COM接口构建了.NET .dll; GUID,名称,dispid等都匹配。我们通过编写自己的C ++测试应用程序来验证这一点,当我们取消注册旧的.dll /注册新应用程序时它继续工作。

问题是客户的客户很难开始。

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

我们已经尝试了不同的方式来注册新的.dll;使用regasm和/ codebase选项,/ tbl等。

如果我使用OLE / COM Viewer进行检查,我可以看到新旧.dll之间的一些细微差别,例如类型库“name”不同。但我想,既然我们自己的C ++测试客户端可以使用.dll COM接口就足够类似了吗?

拜托,任何人都有任何想法?一个C ++客户端如何使用我们的新.dll加载而另一个失败?如果我们将旧的.dll与新的.dll并行注册,为什么两者都有效?有没有解释为什么两个C ++客户端表现不同?


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

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

亲切的问候P.T

1 个答案:

答案 0 :(得分:1)

有很多种可能性。首先,确保注册新DLL的类型库。旧的可能是作为DllRegisterServer的一部分,但AFAIK,.Net DLL不这样做。将其注册到REGTLB.exe。

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

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

相关问题