Вне процесса динамическое управление версиями COM-объекта

Я использую внепроцессный COM-объект, размещенный на myexe.exe. Существует несколько версий этих exe-файлов, в которых размещается COM-объект. Каждая версия может иметь слегка измененные интерфейсы и методы. Каждый из файлов myexe.exe находится в версионных папках (например, C:\v2\myexe.exe, c:\v3\myexe.exe)

Невозможно заранее узнать, какая из версий будет запущена. Мое клиентское приложение подключается к запущенным exe-файлам с помощью ROT. Мне нужно иметь возможность использовать эту версию COM-объекта динамически, обнаруживая интерфейсы через IUnknown.QueryInterface.

К сожалению, я получаю сбой при использовании новых методов, если старая версия COM зарегистрирована в реестре Windows. Как только я регистрирую более новую версию COM вне процесса в реестре Windows, используя "myexe.exe -regserver", сбой исчезает. Поэтому я не могу динамически использовать более старую или более новую версию meexe.exe во время выполнения, так как каждый раз, когда мне нужно перерегистрировать мою версию com.

Любые идеи о том, почему я получаю сбой или как решить проблему?

2 ответа

COM-интерфейсы никогда не версионируются. Каждый COM-интерфейс отличается от любого другого. Вы используете IID для дифференциации и перехода от одного к другому с помощью QueryInterface().

См. Рекомендации QueryInterface и Руководство.

COM-интерфейсы неизменны. После того как вы определили интерфейс и начали использовать его в своих приложениях, вы НЕ МОЖЕТЕ изменить его. Его IID и VTABLE заблокированы. Если вам нужно внести изменения в существующие методы или добавить новые методы, вы ДОЛЖНЫ создать новый интерфейс с новым IID для этой цели (новый интерфейс может быть получен из предыдущего интерфейса, хотя это не требуется). Затем сервер должен реализовать новый интерфейс, и клиенты могут QueryInterface() сервер для нового интерфейса при необходимости. С этим не обойтись, это фундаментальное правило COM, чтобы не нарушать работу существующих клиентов при создании новых версий сервера.

Другие вопросы по тегам