Есть класс 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 добавить интерфейсы
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, Вы писали:
А>>Здравствуйте 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.