У нас проблема с интерфейсами обратного вызова точки подключения 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, который ломает существующих клиентов, мы вынуждены делать это, потому что я думаю, что мы можем
Есть только один интерфейс [по умолчанию, источник].
Может кто-нибудь сказать мне, что обходной путь для этого?
С уважением
Том
Если вы разрабатываете 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 */
}
И так далее.