1

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

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

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

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

问题是客户的客户端无法启动。

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

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

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

请问,有人知道吗?一个 C++ 客户端如何加载我们的新 .dll 而另一个失败?如果我们让旧的 .dll 与新的 .dll 并行注册,为什么两者都可以工作?有什么解释为什么两个 C++ 客户端的行为不同吗?


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

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

亲切的问候 PT

4

1 回答 1

1

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

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

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

于 2012-05-10T19:01:00.290 回答