2009-12-08 6 views
1

Я работаю с некоторым унаследованным кодом C++, и мне нужно расширить интерфейс. Например, текущие интерфейсы:Правильное расширение COM-интерфейса (IDL)

[ 
    object, 
    uuid(guid), 
    version(1.0), 
    dual, 
    nonextensible, 
    oleautomation 
] 
interface IInfo : ITask { 
    // Methods here 
} 

[ 
    object, 
    uuid(guid), 
    version(1.0), 
    dual, 
    nonextensible, 
    oleautomation 
] 
interface IExtendedInfoTask : IInfo { 
    // Methods here 
} 

То, что я хотел бы расширить, это интерфейс IInfo. Теперь из моего понимания правильный способ сделать это - создать интерфейс IInfo2, который наследует интерфейс IInfo, однако мне нужно, чтобы мой IExtendedInfoTask наследовал от этого IInfo2. Изменение его текущего наследования нарушит существующий интерфейс, не так ли?

Будет ли подходящий способ создать IExtendedInfoTask, который расширяет IInfo2 и дублирует методы IExtendedInfoTask?

+0

Разве это не вопрос IDL, а не C++? – 2009-12-08 15:20:55

+0

Извините, да, вы правы. – Kyle

ответ

8

Правильный способ сделать это - создать IExtendedInfoTask2, который расширяет новый интерфейс IInfo2. COM требует, чтобы интерфейс, однажды определенный, был неизменным.

Вы можете иметь один и тот же класс как IExtendedInfoTask, так и IExtendedInfoTask2, поэтому вызывающий может использовать любую из этих версий. Это только разность vtable - вам не нужно реализовывать методы отдельно.

+0

Отлично, спасибо! – Kyle

+0

Tadmas, В чем проблема с добавлением новых функций в конце IExtendedInfoTask? –

+0

@lzprgmr См. Http://msdn.microsoft.com/en-us/library/ms688484(v=vs.85).aspx - интерфейсы должны быть неизменными, чтобы у вас не было проблем с версированием. Изменяя IID при изменении контракта, вы делаете управление версиями явным. Это тот же базовый принцип использования SxS-сборок вместо старого метода «DLL-ад». Конкретная проблема с задачами в конце концов заключается в том, что если реализация интерфейса заменена более старой версией, вы все равно просите о том же IID, и теперь она взорвалась во время выполнения (или хуже), поскольку метод не существует , – Tadmas