Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > один объект с двумя интерфейсами


Автор: me21 14.5.2006, 17:21
Драсьте!

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

через Variant
Код

var vMyObj: Variant;

vMyObj := CreateOleObject('serv_na4.MyObject');
vMyObj.Piramid(AB,AC,AD,AE,BC,CD,DE,EB,h,EC,V,Sosn,Sbok,S); // работает
vMyObj.Ring(R1,R2,angle,P,S); // второй интерфейс, не работает: method not supported by automation object



через интерфейсные переменные всё работает
Код

var vmyobj: interface1; v: interface2;

vMyObj := CoMyObject.Create;
v := vMyObj as Interface2;
vMyObj.Piramid(AB,AC,AD,AE,BC,CD,DE,EB,h,EC,V,Sosn,Sbok,S);
v.Ring(R1,R2,angle,P,S);



как надо переписать работу с вариантом, чтобы тоже всё работало? Поскольку через интерфейсы работает, то в сервере копаться вроде бы не надо? 
 

Автор: Rouse_ 17.5.2006, 19:52
Если без переменных с учетом дефолта первого интерфейса: 
Код

(vMyObj as Interface2).Ring(R1,R2,angle,P,S);


Добавлено @ 19:53 
Хотя я бы перед использованием интерфейсов сначала бы "кверил" на существование самого интерфейса (мало ли что)... 

Автор: me21 19.5.2006, 14:55
Не компилирует: Operator is not applicable to this operand type.
Решил проблему с помощью своей реализации IDispatch. Насколько я понял, это единственный способ вызвать метод недефолтного интерфейса при позднем связывании (задание было именно такое - использовать позднее связывание). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)