c++ - 进程外 COM 对象动态版本控制
问题描述
我正在使用由 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 版本。
关于我为什么会崩溃或如何解决问题的任何想法?
解决方案
COM 接口是不可变的。一旦你定义了一个接口并开始在你的应用程序中使用它,你就不能再改变它了。它的 IID 和 VTABLE 被锁定。如果您需要对现有方法进行更改或添加新方法,您必须为此目的创建一个具有新 IID 的新接口(新接口可以从以前的接口派生,尽管这是不需要)。然后服务器必须实现新接口,客户端可以QueryInterface()
在需要时为新接口服务。无法绕过这一点,这是 COM 的基本规则,以免在创建新服务器版本时破坏现有客户端。
推荐阅读
- javascript - 一旦DOM中发生事件,有什么方法可以找到javascript文件
- java - 从 txt 文件中读取字符串并将其存储到 java 中的 char 数组中
- r - R - 如何向 ggplot2 饼图图例添加百分比?
- php - 如何从本地 PC 在 VMWARE 中打开 laravel 网站?
- java - “找不到符号”类 DataSourceBuilder [错误] 位置:包 org.springframework.boot.autoconfigure.jdbc
- wordpress - WordPress POT 文件被忽略
- asp.net - 如何从我的应用程序 asp.net MVC 将文件上传到另一个网站?
- r - 根据另一个变量的值控制颜色的顺序
- javascript - 从 onClick 图标触发 React Pikaday 日历
- powershell - Invoke-Command 无法识别 -ComputerName