
Может, кто подскажет, в чем собака порылась?
Модераторы: m0p3e, edward_K, Модераторы
Что же вы забыли привести здесь другой аспект COM технологии, а именно независимость клиента от сервера, которая обеспечивается интерфейсами. Изменение интерфейса (имеется в виду добавление новых методов) НЕ ПРИВОДИТ К НЕОБХОДИМОСТИ ПЕРЕКОМПИЛЯЦИИ КЛИЕНТА!!! Действительно, обычно не меняют компонент, а вводят новую версию, но для клиента использование нового компонента абсолютно прозрачно, т.к. обращение производится по независимому от версии ProgID. Т.е., если я использую в программе объект Excel, то независимо от того, какая версия Excel установлена на компьютере, программа будет работать штатно без всяких перекомпиляций. Почему же мы должны перекомпилировать свои подправленные присоединенные формы всякий раз, когда вы измените интерфейс (а вы их меняете, это факт)?Screw писал(а):Азы com-технологии, подобие которой мы наблюдаем в Атлантисе, гласят о том, что однажды опубликованный com-интерфейс (ojb-интерфейс в Атлантисе) НЕ МОЖЕТ МЕНЯТЬСЯ!!!
Код: Выделить всё
objinterface ObjInterface1
procedure Method1;
procedure Method2;
...
end;
...
vipinterface VipInterface1 implements ObjInterface1;
...
interface VipInterface1;
...
public procedure Method1;
{
...
}
public procedure Method2;
{
...
}
...
end;
Код: Выделить всё
objinterface ObjInterface1
procedure Method1;
procedure Method2;
...
end;
objinterface ObjInterface2
procedure Method3;
...
end;
...
vipinterface VipInterface1 implements ObjInterface1, ObjInterface2;
...
interface VipInterface1;
...
public procedure Method1;
{
...
}
public procedure Method2;
{
...
}
public procedure Method3;
{
...
}
...
end;
Код: Выделить всё
var V1: VipInterface1;
...
V1.Method1;
V1.Method2;
...
ObjInterface2(V1).Method3;
...
Код: Выделить всё
var O1: ObjInterface1;
LoadVipRef(O1, 'VipInterface1');
...
O1.Method1;
O1.Method2;
...
ObjInterface2(O1).Method3;
...
Теория, это конечно хорошо, но вы попробуйте в VS внести новый метод в декларацию интерфейса (обязательно в конец!!!), пересоберите компонент и запустите приложение, которое раньше использовало этот компонент. Все прекрасно будет работать, потому-что в виртуальную таблицу ссылок новый метод будет добавлен в конец (методы добавляются в порядке объявления). А вызов методов в COM происходит по смещению в этой таблице. Фактически, новый метод не будет виден старому приложению, но его функциональность сохраниться. Почему у вас то так не работает?Screw писал(а):Любезный оппонент, упомянутая Вами независимость клиента от сервера как раз и достигается выполнением сформулированного мною правила. Сие есть следствие. Изменение однажды опубликованного интерфейса НЕДОПУСТИМО ни под каким соусом.
Новая версия компонента содержит измененные реализации некоторых методов com-интерфейса да еще, возможно, реализации методов неких новых com-интерсейсов, либо методов интерфейсов, унаследованных от базового (базовых). В таких условиях клиенты, использующие функциональность, заявленную при помощи старых com-интерфейсов, не перекомпилируются и продолжают прекрасно работать. Пересобирается, само собой, только реализация и клиенты, требующие новую функциональность.
А вот это не может не радоватьНа справедливое утверждение о том, что наши разработчики, несмотря на глубокие познания в области современных технологий программирования, позволяют себе изменять объектные интерфейсы, могу ответить следующее: разъяснительная работа ведется.
Еще бы, вам то проще обычные интерфейсы использовать - #include .vih и все делаScrew писал(а):Что касается Dispatch-интерфейсов, то я, признаться, до сих пор ни разу не столкнулся с необходимостью их применения. Может быть, будь я не разработчиком, а пользователем, обстоятельства сложились бы иначе Ж:о)