Подскажите, как в AutoObject добавить интерфейсы
От: SergJP Россия  
Дата: 24.01.02 15:21
Оценка:
HI, ALL!

Вопрос чайника:

Есть класс Automation object A. У него интерфейс IA
Через редактор TLB добавил к нему еще один интерфейс IB.
Теперь хочется в клиенте этот IB увидеть и поюзать.
Когда в инициализации A создаешь B := CreateComObject(гуид B) as IB;
ругается на незарегистрированный класс (а кнопка на редакторе ТЛБ была
нажата, даже несколько раз)
Подскажите в чем дело? Может я слишком много хочу?

Сергей
Сергей
Re: Подскажите, как в AutoObject добавить интерфейсы
От: Аноним  
Дата: 24.01.02 17:27
Оценка:
Здравствуйте SergJP, Вы писали:

SJP>HI, ALL!


SJP>Вопрос чайника:


SJP>Есть класс Automation object A. У него интерфейс IA

SJP>Через редактор TLB добавил к нему еще один интерфейс IB.
SJP>Теперь хочется в клиенте этот IB увидеть и поюзать.
SJP>Когда в инициализации A создаешь B := CreateComObject(гуид B) as IB;
SJP>ругается на незарегистрированный класс (а кнопка на редакторе ТЛБ была
SJP>нажата, даже несколько раз)
SJP>Подскажите в чем дело? Может я слишком много хочу? :))

SJP>Сергей


Хотелось бы понять, а что такое в

B := CreateComObject(гуид B) as IB;

гуид B?

Это случаем не guid интерфейса IB?

Если догадка верна, то надо так

B := CreateComObject(Class ID Automation object A) as IB;

Если не верна — то вбросте код из _TLB.PAS
Re[2]: Подскажите, как в AutoObject добавить интерфейсы
От: kig Россия  
Дата: 24.01.02 17:29
Оценка:
Сорри — поторопился и не подписался.
Re[2]: Подскажите, как в AutoObject добавить интерфейсы
От: Аноним  
Дата: 25.01.02 11:01
Оценка:
Здравствуйте Kig, Вы писали:

А>Здравствуйте SergJP, Вы писали:


SJP>>HI, ALL!


SJP>>Вопрос чайника:


SJP>>Есть класс Automation object A. У него интерфейс IA

SJP>>Через редактор TLB добавил к нему еще один интерфейс IB.
SJP>>Теперь хочется в клиенте этот IB увидеть и поюзать.
SJP>>Когда в инициализации A создаешь B := CreateComObject(гуид B) as IB;
SJP>>ругается на незарегистрированный класс (а кнопка на редакторе ТЛБ была
SJP>>нажата, даже несколько раз)
SJP>>Подскажите в чем дело? Может я слишком много хочу? :))

SJP>>Сергей


А>Хотелось бы понять, а что такое в


А>B := CreateComObject(гуид B) as IB;


А>гуид B?


А>Это случаем не guid интерфейса IB?


А>Если догадка верна, то надо так


А>B := CreateComObject(Class ID Automation object A) as IB;


А>Если не верна — то вбросте код из _TLB.PAS



Спасибо, сработало.
Только есть проблема — при создании B := CreateComObject(Class ID Automation object A) as IB;
происходит полная инициализация родительского объекта A.

Если B рассматривать как property интерфейса IA, т. е.

IA = interface
property B : IB;
end;

то Дельфи сгенерирует метод function Get_B : IB;
и в нем придется поставить вызов

Result := CreateComObject(Class ID Automation object A) as IB;

что приведет к повторной инициализации объекта A.
Интересно, если я к Exel обращаюсь ExcelApplication.Workbook[1].Worksheet[1].Cell[1,2];
то при обращении к ячейке 1,2 инициализируется вся ExcelApplication ?

Или есть способ лучше?
Rondo ни при чем. :-))
Re[3]: Подскажите, как в AutoObject добавить интерфейсы
От: kig Россия  
Дата: 25.01.02 15:38
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте Kig, Вы писали:


А>>Здравствуйте SergJP, Вы писали:


SJP>>>HI, ALL!


SJP>>>Вопрос чайника:


SJP>>>Есть класс Automation object A. У него интерфейс IA

SJP>>>Через редактор TLB добавил к нему еще один интерфейс IB.
SJP>>>Теперь хочется в клиенте этот IB увидеть и поюзать.
SJP>>>Когда в инициализации A создаешь B := CreateComObject(гуид B) as IB;
SJP>>>ругается на незарегистрированный класс (а кнопка на редакторе ТЛБ была
SJP>>>нажата, даже несколько раз)
SJP>>>Подскажите в чем дело? Может я слишком много хочу? :))

SJP>>>Сергей


А>>Хотелось бы понять, а что такое в


А>>B := CreateComObject(гуид B) as IB;


А>>гуид B?


А>>Это случаем не guid интерфейса IB?


А>>Если догадка верна, то надо так


А>>B := CreateComObject(Class ID Automation object A) as IB;


А>>Если не верна — то вбросте код из _TLB.PAS



А>Спасибо, сработало.

А>Только есть проблема — при создании B := CreateComObject(Class ID Automation object A) as IB;
А>происходит полная инициализация родительского объекта A.

А>Если B рассматривать как property интерфейса IA, т. е.


А>IA = interface

А> property B : IB;
А> end;

А>то Дельфи сгенерирует метод function Get_B : IB;

А>и в нем придется поставить вызов

А>Result := CreateComObject(Class ID Automation object A) as IB;


А>что приведет к повторной инициализации объекта A.

А>Интересно, если я к Exel обращаюсь ExcelApplication.Workbook[1].Worksheet[1].Cell[1,2];
А>то при обращении к ячейке 1,2 инициализируется вся ExcelApplication ?

А>Или есть способ лучше?

А>Rondo ни при чем. :-))

Если я правильно понял, у Вас класс объекта выглядит примерно так (могут быть ошибки в синтаксисе — давно к Д не подходил):

TA = class(TAutoObject, IA, IB)
bla-bla ...
function Get_B : IB;
end

Для получения разных интерфейсов в Д необходимо проделать примерно следующее. Например код клиента Вашего объекта:

var
a: IA;
b: IB;
begin
a := CreateComObject(Class ID Automation object A);
b = a as IB; // в этот момент выполняется a.QueryInterface(...guid IB...)
a = b as IA; // в этот момент выполняется b.QueryInterface(...guid IA...)
...

end;

поэтому Вам в реализации function Get_B : IB необходимо написать следующее
result := self as IB;

Но как видно — это св-во лишнее в интерфейсе IA. Клиент без всяких пропертей может получить ссылку на IB.


Успехов.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.