Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.05;
Скачать: CL | DM;

Вниз

Nested COM objects (непереводимый диалект)   Найти похожие ветки 

 
Elritar ©   (2004-02-25 05:05) [0]

Итак, задача в следующем. Имеется ActiveX Library, в которую добавлено два Automation Object. Требуется, чтобы один из объектов, пусть, скажем, ему соответствует класс TPlugin и интерфейсы IPlugin/IPluginDisp, при своей инициализации (пусть она происходит вызовом функции-члена Init) создавал экземпляр другого объекта, TFeature, которому соответствуют интерфейсы IFeature/IFeatureDisp, и впоследствии предоставлял к созданному экземпляру этого объекта доступ через свое общедоступное read-only свойство, что-то в таком духе:
TPlugin = class(TAutoObject, IPlugin)
protected
procedure Init; safecall;
function Get_Feature: IFeature; safecall;
private
fFeature: TFeature;
end;

Соответствующий интерфейс выглядят так:
ICore = interface(IDispatch)
["{...}"]
procedure Init(const lpUnk: IUnknown); safecall;
function Get_Feature: IFeature; safecall;
property Feature: IFeature read Get_Feature;
end;

В методе Init происходит примерно следующее:
procedure TPlugin.Init;
begin
fFeature:= TFeature.Create;
end;

Ну а что делает Get_Feature догадаться несложно - возвращает fFeature.
Так вот, требуется, например, чтобы на JScript можно было написать такой код:
var MyPlugin=new ActiveXObject("MyLib.Plugin");
if (MyPlugin) MyPlugin.Feature.SayHello();

где SayHello - какой-нибудь метод объекта TFeature.
В таком виде как это реализовано у меня, подобный код выдает ошибку JScript о том, что "MyPlugin.Feature есть null или не является объектом"

Я также пробовал возвращать через функцию Get_Feature не интерфейс IFeature а IUnknown, и тип OleVariant. Ничего не помогает. В чем может быть загвоздка?


 
opuhshii ©   (2004-02-25 09:57) [1]

может в 17-строке?
а как реализовано Get_Feature в TPlugin


 
Romkin ©   (2004-02-25 10:48) [2]

http://www.techvanguards.com/com/tutorials/objecthierarchies.asp
Опять поветрие, похоже. Теперь пошел поток вопросов по иерархии СОМ :))
implements посмотри еще :) Точнее, Using implements for delegation


 
Тимохов ©   (2004-02-25 11:52) [3]

Ошибка в том, что вы мешаете модель интерфейсов и модель объектов.
Как писАл Эрик Хармон так можно делать только если вы очень в этом крутЫ. Вообще говоря он рекоммендовал избегать такого обращения с интерфейсами.

Замените fFeature: TFeature на fFeature: IFeature.
Если это не представлется возможным, то перекрывайте _AddRef и _Release и разбирайтесь сами с подсчетом ссылок.

Если будет очень интересно, то могу поведать почему у вас происходит такая ошибка. Но это только если действительно будет интересно.


 
Тимохов ©   (2004-02-25 11:58) [4]

Вообще говоря, очень рекоммендую почитать книгу вышеобозначенного Эрика Хармона про разработку КОМ в Дельфи.
Там много полезного.


 
Elritar ©   (2004-02-25 17:14) [5]

" Замените fFeature: TFeature на fFeature: IFeature"

В таком случае я не смогу вызывать конструктор - ведь у интерфейсов не бывает конструкторов. Критически важно его вызвать при инициализации. Что же делать? Создать метод, реализующий ту же функциональность? Это не кажется достаточно надежным. Что если пользователь попробует создать TFeature в обход TPlugin, и не вызовет этот метод?

" Вообще говоря, очень рекоммендую почитать книгу вышеобозначенного Эрика Хармона про разработку КОМ в Дельфи."

В электронном виде она существует? Можете дать ссылку?


 
Тимохов ©   (2004-02-25 17:19) [6]


> В электронном виде она существует? Можете дать ссылку?

Не знаю.


> В таком случае я не смогу вызывать конструктор - ведь у
> интерфейсов не бывает конструкторов. Критически важно его
> вызвать при инициализации. Что же делать? Создать метод,
> реализующий ту же функциональность? Это не кажется достаточно
> надежным. Что если пользователь попробует создать TFeature
> в обход TPlugin, и не вызовет этот метод?

Почему не можете вызывать конструктор?
Пишите
fFeature: IFeature;
fFeature := TFeature.Create(params).
Чем плохо?

У интерфейсов не бывает ничего - ни методов, ни конструторов - на то они и интерфейсы. Все методы реализованы в объектах.



Страницы: 1 вся ветка

Текущий архив: 2004.03.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.016 c
8-12457
killsniper
2003-09-22 05:50
2004.03.05
Помогите, люди добрые, с графикой под DelphiX!


6-12480
Michael_X
2003-12-17 17:54
2004.03.05
Определение удалённой ОС.


3-12264
sdram
2004-02-09 10:35
2004.03.05
Помогите отсортировать числовые значения и строки в запросе


3-12295
Alexander Smith
2004-02-06 17:01
2004.03.05
DBGrid, скроллинг


1-12330
Budy
2004-02-20 05:22
2004.03.05
Про TImage