一个C++客户端无法使用我们新的 COM 注册的 .NET .dll加载,另一个客户端可以正常工作
One C++ client fails to load with our new COM registered .NET .dll, another works
我们有一个旧的 C/C++ .dll,客户通过 COM 访问它。
我们试图用编写的新 .NET 替换旧.dll。
客户无法重新编译其客户端,因此重要的是旧.dll可以简单地替换为COM取消注册/注册新(使用regsvr32/regasm(。
我们相信我们已经使用与旧 COM 接口相同的 COM 接口构建了 .NET .dll;GUID、名称、分发等都匹配。我们已经通过编写自己的C++测试应用程序来验证这一点,当我们取消注册旧.dll/注册新时,它将继续工作。
问题是客户的客户端无法启动。
奇怪的是,如果我们让旧.dll注册(例如,两个.dll都被注册(,它会起作用;客户的应用程序在我们的新.dll中启动和调用方法。但是一旦我们取消注册旧.dll应用程序就无法重新启动。
我们尝试了不同的方法来注册新.dll;使用带有/codebase 选项、/tbl 等的 regasm。
如果我使用 OLE/COM 查看器进行检查,我可以看到新旧.dll之间的一些细微差异,例如类型库"名称"不同。但我想既然我们自己的C++测试客户端可以使用任一.dll COM 接口是否足够相似?
拜托,有人知道吗?一个C++客户端怎么可能加载我们的新.dll而另一个客户端失败?如果我们让旧.dll与新并行注册,为什么两者都有效?有什么解释为什么两个C++客户端的行为不同吗?
更新:客户端中的错误消息显示:
"运行时失败:CLSIDFromProgID。检查 [myDll].dll 是否已注册。
亲切的问候 P.T
有很多可能性。首先,请确保注册新 DLL 的类型库。旧的可能是DllRegisterServer的一部分,但AFAIK,.Net DLL没有。在REGTLB.exe注册。
还要检查两个 DLL 中的线程模型是否相同。
如果这些都无济于事,我建议你继续下去,直到 OLEVIEW 说它们是相同的——你永远不知道客户在做什么,这与你的不同。
- 下一个云桌面客户端构建过程
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- C++启动另一个程序(客户端-服务器)的程序
- 我正在编写一个简单的客户端套接字应用程序,但在连接后服务器收到一个空缓冲区
- 用C++编写一个函数,其中客户端决定从类运行哪个函数
- 是否可以寻址另一个网络中的服务器/客户端套接字?(C++)
- 如何在GRPC客户端中创建到一个特定地址C++多个连接
- 如果另一侧失去了他的净连接,我该如何从客户端/服务器端检测
- C++:一个客户端与多个服务器通信
- 我必须编写一个FTP客户端.不知道从哪里开始.C++
- C 选择仅检查最后一个客户端套接字
- 从一个客户端连接两个套接字
- 一个 c++ 中的 gui 库作为 Web 客户端
- 多线程服务器在一个线程中处理多个客户端
- C++释放Windows上另一个进程使用的网络端口
- 一个C++客户端无法使用我们新的 COM 注册的 .NET .dll加载,另一个客户端可以正常工作
- 我可以从两个oci客户端维护一个Oracle会话吗
- UNIX中两个进程之间通信的最佳方式:一个运行ruby服务器,另一个运行C++客户端
- Boost::为每个客户端创建一个单独的数组
- 具有多个客户端的服务器:如何将消息从一个客户端转发到另一个客户端