neetagaikwad Ответов: 2

Как расширить или изменить уже опубликованный интерфейс COM - объекта в C++


У меня есть запрос на добавление нового метода в уже опубликованный COM-объект
interface ItestAutomationServer : IDispatch

добавьте еще один параметр out в существующий метод следующего интерфейса
interface ISinkNewAutomationTest : IUnknown 

кто-нибудь знает, как это решить?

Что я уже пробовал:

Я унаследовал следующий и добавил новый метод
interface ItestAutomationServer1 : ItestAutomationServer

Я унаследовал следующее И добавил новый метод с этим дополнительным параметром
interface ISinkNewAutomationTest1 : ISinkNewAutomationTest 

F-ES Sitecore

Не могу помочь со спецификой реализации, но обычно это делается с помощью переадресации интерфейса. Если вы добавите параметр к существующему методу, то он сломает объекты, уже скомпилированные против него. Поэтому вместо этого вы создаете новый метод на новом интерфейсе, который имеет соответствующие параметры, и оставляете единственный интерфейс на месте. Вы меняете старый интерфейс, чтобы вызвать новый интерфейс, чтобы старый код продолжал работать, и если интерфейс зарегистрирован правильно, любой код, скомпилированный против нового интерфейса, увидит дополнительный параметр.

2 Ответов

Рейтинг:
1

KarstenK

Обычно это делается с помощью новой версии интерфейса. Чем имплеменация запрашивает необходимый интерфейс и его версию. Чем пользоваться Метод queryinterfaceметод получения поддерживаемого интерфейса. См. пример поддержки различных интерфейсов.

Наследование-хорошая идея, потому что оно обеспечивает совместимость.


Рейтинг:
0

CPallini

COM интерфейсы есть immutable вы не должны пытаться изменить их. Вы должны создать новый интерфейс... От самого документация[^]:

COM-интерфейсы являются неизменяемыми. Вы не можете определить новую версию старого интерфейса и присвоить ей тот же идентификатор. Добавление или удаление методов интерфейса или изменение семантики создает новый интерфейс, а не новую версию старого интерфейса.