0

我正在使用由 myexe.exe 托管的进程外 COM 对象。托管 COM 对象的这些 exe 有多个版本。每个版本的接口和方法都可以略有改变。每个 myexe.exe 文件都位于版本化文件夹中(例如 C:\v2\myexe.exe、c:\v3\myexe.exe)

无法提前知道哪个版本将运行。我的客户端应用程序使用 ROT 附加到正在运行的 exe。我需要能够动态使用该 COM 对象版本,通过 IUnknown.QueryInterface 发现接口。

不幸的是,如果在 Windows 注册表中注册了旧版本的 COM,我在使用新方法时会崩溃。一旦我使用“myexe.exe -regserver”在 Windows 注册表中注册了较新版本的进程外 COM,崩溃就会消失。所以我不能在运行时动态使用旧版本或新版本的 meexe.exe,因为每次我需要重新注册我的 com 版本。

关于我为什么会崩溃或如何解决问题的任何想法?

4

2 回答 2

0

COM 接口是不可变的。一旦你定义了一个接口并开始在你的应用程序中使用它,你就不能再改变它了。它的 IID 和 VTABLE 被锁定。如果您需要对现有方法进行更改或添加新方法,您必须为此目的创建一个具有新 IID 的新接口(新接口可以从以前的接口派生,尽管这是不需要)。然后服务器必须实现新接口,客户端可以QueryInterface()在需要时为新接口服务。无法绕过这一点,这是 COM 的基本规则,以免在创建新服务器版本时破坏现有客户端。

于 2019-06-24T17:12:34.223 回答
0

COM 接口从不版本化。每个 COM 接口都与其他任何接口一样不同。您使用 IID 来区分并使用 QueryInterface() 从一个到另一个。

请参阅QueryInterface指南和指南

于 2019-06-24T16:03:57.387 回答