Вне процесса динамическое управление версиями COM-объекта - PullRequest
0 голосов
/ 24 июня 2019

Я использую внепроцессный 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 ]

0 голосов
/ 24 июня 2019

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

0 голосов
/ 24 июня 2019

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

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

...