Обновление интерфейса обратного вызова COM

У нас проблема с интерфейсами обратного вызова точки подключения COM

В нашем Sample.idl у нас есть несколько интерфейсов обратного вызова ISomeEvents

interface ISomeEvents : IUnknown
{
HRESULT Event1([in]int nData);
HRESULT Event2([in]int nData);
HRESULT Event3([in]int nData);
}

And in the CoClass we have the following statement
coclass MyComp
{
[default] interface IMyInterface;
interface IMyInterFace2;
[default, source] interface ISomeEvents;
};

Теперь всякий раз, когда мы добавляем новые интерфейсы как часть расширения, это не нарушает существующего клиента, но если расширение имеет
Любые изменения в обратном вызове, затем мы в конечном итоге обновляем интерфейс ISomeEvents, который ломает существующих клиентов, мы вынуждены делать это, потому что я думаю, что мы можем
Есть только один интерфейс [по умолчанию, источник].

Может кто-нибудь сказать мне, что обходной путь для этого?

С уважением
Том

0

Решение

Если вы разрабатываете COM-объект, где клиент (ы) работают / работают, вам действительно не следует менять существующий интерфейс или интерфейс. Это всегда было фундаментальным правилом разработки COM: «интерфейсы неизменны»; Конечно, исключения делаются на ранних этапах разработки.

(Вот цитата, например: «COM-интерфейсы являются неизменными. Вы не можете определить новую версию старого интерфейса и дать ему тот же идентификатор.» (http://msdn.microsoft.com/en-us/library/windows/desktop/ms688484(v=vs.85).aspx). Посмотрите «интерфейсы являются неизменяемыми» в Интернете для гораздо большего)

В этом случае вы должны создать новые интерфейсы ISomeEvents2, ISomeEvents3и так далее по мере необходимости, и эти интерфейсы наследуются от предыдущей версии. Сделайте новый интерфейс вашим новым источником по умолчанию.

interface ISomeEvents1 : ISomeEvents
{
/* new enhanced events here, for use by newly compiled clients */
}

В конце концов, если вам нужно больше изменений:

interface ISomeEvents2 : ISomeEvents1
{
/* Even newer enhanced events here, for even newer clients */
}

И так далее.

1

Другие решения


По вопросам рекламы [email protected]