Текущий архив: 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