![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
AutoObject [D5]
АНАТОЛИЙ © (2001-12-24 13:29:00)ВОПРОС: Как создать наследника от TAutoObject(или от другого класса),чтобы он не регистрировал себя в реестре,т.е.без использования секции initialization,
{
TAutoObjectFactory.Create(ComServer, TXXX,Class_XXX,ciMultiInstance, tmFree);
}
но такого, чтобы получив ссылку на необходимый интерфейс можно
было бы с ним (интерфейсом) работать далее.
АНАТОЛИЙ (2001-12-25 17:25:00) [1]САМ СЕБЕ
НЕ ПОЛУЧИЛОСЬ ЗАГРУЗИТЬ > 1 *.TLB
Delphi НЕ ДАЕТ
ЕСЛИ НЕ ХОЧЕТСЯ ТАЩИТЬ *.TLB за собой
НАДО РАБОТАТЬ ЧЕРЕЗ РЕСУРСЫ
АНАТОЛИЙ (2001-12-25 17:05:00) [2]EЩЕ ПРОБЛЕМА(САМ НЕ РЕШАЛ) ВОЗНИКЛА НА ХОДУ.
МОЖЕТ БЫТЬ КТО ОТВЕТИТ С ХОДУ.
ЗАГРУЖАЮ В ПРОЕКТЕ В РАЗНЫХ *.DCU НЕСКОЛЬКО *.TLB
{$R 1.TLB}
{$R 2.TLB}
ВОПРОС
КАК ПОЛУЧИТЬ ITypeLib НА НУЖНУЮ *.TLB
GARIK_PR (2001-12-25 16:54:00) [3]Спасибо.
АНАТОЛИЙ (2001-12-25 16:49:00) [4]ПРЕДВАРИТЕЛЬНО СОЗДАЙ PROJECT.TLB(И ТОЛЬКО)
File-New-ActiveX-TypeLibrary
В примере один интерфасе IBOBRIK и у него 3 метода(TEST,TEST1,TEST2)
uses PROJECT_TLB;
TBobrik =class(TAutoIntfObject,IBOBRIK)
Constructor Create;
procedure TEST;safecall;
procedure TEST1;safecall;
procedure TEST2(Param1: OleVariant); safecall;
end;
var
I_B : IBOBRIK;
Constructor TBobrik.Create;
var Buffer: array[0..261] of char;
MName : string;
I_TYPE_LIB : ITypeLib;
begin
SetString(MName,Buffer,Windows.GetModuleFileName(HInstance,Buffer,SizeOf(Buffer)));
OleCheck(LoadTypeLib(PWideChar(WideString(MName)),I_TYPE_LIB));
Inherited Create(I_Type_Lib,IBOBRIK);
end;
procedure TBobrik.TEST;
Begin
ShowMessage("11111");
end;
procedure TBobrik.TEST1;
Begin
ShowMessage("22222222");
end;
procedure TBOBRIK.TEST2(Param1: OleVariant); safecall;
begin
ShowMessage(Param1);
End;
procedure TForm1.Button1Click(Sender: TObject);
begin
// ПОЛУЧАЮ ССЫЛКУ НА ИНТЕРФЕЙС
I_B:=TBOBRIK.Create;
// А ЭТО РАБОТА СО СКРИПТАМИ И УЖЕ ДРУГАЯ ИСТОРИЯ
ScriptEngine.AddGlobalObject("x",IUNKNOWN(I_B));
ScriptEngine.Open;
ScriptEngine.ParseScript("x.TEST");
ScriptEngine.ParseScript("call x.Test2("ПРИВЕТ СКРИПТ")");
ScriptEngine.Close;
end;
GARIK_PR (2001-12-25 16:31:00) [5]Покажи, а вдруг пригодится, работа с COM объектами.
АНАТОЛИЙ (2001-12-25 16:28:00) [6]ВСЕМ СПАСИБО.
ВСЕ ПОЛУЧИЛОСЬ ЧЕРЕЗ НАСЛЕДНИКА TAutoIntfObject.
КОМУ ИНТЕРЕСНО МОГУ ПОКАЗАТЬ.
Digitman (2001-12-24 18:05:00) [7]А еще лучше - наследовать TXXX от TComponent и использовать, соответственно, TComponentFactory. Потому как TComponent уже реализует методы GetIDsOfNames() и Invoke().
Romkin (2001-12-24 17:57:00) [8]???
Объект (внутренний) создается стандартно:
type
TFoo = class(TAutoObject, IFoo)...
var
AFoo: IFoo;
AFoo := TFoo.Create;
Тебе требуется для скрипта IDispatch, а у него есть подключение к TypeLib
Поэтому создавай AutoObject, и не мучайся
А ITypeLib - это проперти TComServer
АНАТОЛИЙ (2001-12-24 17:56:00) [9]ГДЕ ПОЧИТАТЬ ?
Digitman (2001-12-24 17:55:00) [10]Почитай про фиксированные методы IDispath.GetIDsOfNames и IDispath.Invoke() и реализуй их в своем классе. Это все, что нужно для работы скрипта с любым объектом, предоставляющим диспинтерфейс.
АНАТОЛИЙ (2001-12-24 17:48:00) [11]КАК РЕАЛИЗОВАТЬ Ixxx = interface(IDispath),
чтобы VBScript понимал вызов его функций
Digitman (2001-12-24 17:43:00) [12]Наследуй TXXX от TInterfacedObject и реализуй в нем Ixxx = interface(IDispath)
АНАТОЛИЙ (2001-12-24 17:35:00) [13]1 ? for Romkin
КАК ПОЛУЧИТЬ ССЫЛКУ НА ITypeLib(необходимо при создании обьекта)
2 ? for DIGITMAN
а) В программе создается обьект TXXX(потомок TAutoObject),имеющий
интерфейс Ixxx c функцией TEST.
б) делаю доступным Ixxx для скрипта под именем DIGITMAN
В) в скрипте выполняется DIGITMAN.TEST
Romkin (2001-12-24 17:22:00) [14]Тебе нужен TAutoIntfObject, если type library не надо - делай сам потомка от TComObject с реализацией IDispatch
Digitman (2001-12-24 17:18:00) [15]приведи строчку из скрипта, выполнение которой требует создания/использования экземпляра твоего объекта
АНАТОЛИЙ (2001-12-24 17:09:00) [16]Я использую TXXX в VBScript(JScript),
наследник от TInterfacedObject не работает.
???
Digitman (2001-12-24 17:02:00) [17]>АНАТОЛИЙ
А зачем ты вообще наследовал свой класс TXXX от TAutoObject, если тебе не нужно задействовать механизм фабрики классов ? Наследуй его прямиком от TInterfacedObject и создавай экз-р на здоровье. Никаких фабрик и не потребуется при этом.
АНАТОЛИЙ (2001-12-24 16:57:00) [18]ВСЕ НЕ ТАК ПРОСТО.
экз-р обьекта не создается-требует фабрику класса
???
Digitman (2001-12-24 16:31:00) [19]Да просто удали секцию инициализации модуля вместе со строчкой TAutoObjectFactory.Create(...). Вот и избавишься от нее). Какие проблемы-то ? Не хочешь, чтобы фабрика класса автоматически порождала экз-ра класса - не регистрируй ее и не используй. Делов-то ....)
АНАТОЛИЙ (2001-12-24 16:12:00) [20]У меня нет сервера автоматизации.
К проекту подключаю все *.DCU, в которых реализован TXXX(см.выше).
Создаю экз-р обьекта := TXXX.Create;,
но при этом необходимо
initialization
TAutoObjectFactory.Create(ComServer, TXXX,Class_XXX,ciInternal, tmFree);
КАК ИЗБАВИТСЯ ОТ TAutoObjectFactory.Create(...) ?
КАК ИЗБАВИТСЯ ОТ initialization ?