我正在使用由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,崩溃将消失。因此,由于每次需要重新注册com版本时,我都无法在运行时动态使用旧版本或更高版本的meexe.exe。
关于我为什么坠机或如何解决问题的任何想法?
答案 0 :(得分:0)
COM接口的版本为从不。每个COM接口都与其他接口不同。 您可以使用IID进行区分,并使用QueryInterface()来将它们彼此区分。
请参阅QueryInterface准则和Guide。
答案 1 :(得分:0)
COM接口是不可变的。定义接口并开始在应用程序中使用它后,就无法再对其进行更改。它的IID和VTABLE已锁定。如果您需要更改现有方法或添加新方法,则必须为此创建一个具有新IID的新接口(新接口可以从先前的接口派生,不需要)。然后,服务器必须实现新接口,并且客户端可以在需要时为新接口QueryInterface()
服务器。没有解决方法,这是COM的基本原则,以免在创建新服务器版本时破坏现有客户端。