Форум: "Основная";
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];
ВнизAutoObject Найти похожие ветки
← →
АНАТОЛИЙ (2001-12-24 13:29) [0]ВОПРОС: Как создать наследника от TAutoObject(или от другого класса),чтобы он не регистрировал себя в реестре,т.е.без использования секции initialization,
{
TAutoObjectFactory.Create(ComServer, TXXX,Class_XXX,ciMultiInstance, tmFree);
}
но такого, чтобы получив ссылку на необходимый интерфейс можно
было бы с ним (интерфейсом) работать далее.
← →
Digitman (2001-12-24 13:39) [1]Вместо ciMultiInstance пиши ciInternal, тогда при выполнении конструктора фабрика класса регистрироваться в реестре не будет
← →
АНАТОЛИЙ (2001-12-24 15:21) [2]В этом случае регистрируется TypeLib.
Как избавится от этого?
ВОТ МОЯ ПРОБЛЕМА
Задача: работаю с VBScript и JavaScript не в Internet Explorer,
а в DELPHI( технология MSScript).
В программе(DELPHI) необходимо создать [интерфейсный] обьект,
чтобы его понимал VBScript|JavaScript.
КАК ЭТО СДЕЛАТЬ ??
← →
Digitman (2001-12-24 15:47) [3]Ну, наверно, примерно так :
var
MyAutoObjFactory:
ComObjectInstance: TComObject;
....
ComObjectInstance:= MyAutoObjFactory.CreateComObject(nil); // здесь , собственно, и сосздается экз-р объекта
initialization
MyAutoObjFactory:= TAutoObjectFactory.Create(ComServer, TXXX,Class_XXX,ciInternal, tmFree);
← →
АНАТОЛИЙ (2001-12-24 16:12) [4]У меня нет сервера автоматизации.
К проекту подключаю все *.DCU, в которых реализован TXXX(см.выше).
Создаю экз-р обьекта := TXXX.Create;,
но при этом необходимо
initialization
TAutoObjectFactory.Create(ComServer, TXXX,Class_XXX,ciInternal, tmFree);
КАК ИЗБАВИТСЯ ОТ TAutoObjectFactory.Create(...) ?
КАК ИЗБАВИТСЯ ОТ initialization ?
← →
Digitman (2001-12-24 16:31) [5]Да просто удали секцию инициализации модуля вместе со строчкой TAutoObjectFactory.Create(...). Вот и избавишься от нее). Какие проблемы-то ? Не хочешь, чтобы фабрика класса автоматически порождала экз-ра класса - не регистрируй ее и не используй. Делов-то ....)
← →
АНАТОЛИЙ (2001-12-24 16:57) [6]ВСЕ НЕ ТАК ПРОСТО.
экз-р обьекта не создается-требует фабрику класса
???
← →
Digitman (2001-12-24 17:02) [7]>АНАТОЛИЙ
А зачем ты вообще наследовал свой класс TXXX от TAutoObject, если тебе не нужно задействовать механизм фабрики классов ? Наследуй его прямиком от TInterfacedObject и создавай экз-р на здоровье. Никаких фабрик и не потребуется при этом.
← →
АНАТОЛИЙ (2001-12-24 17:09) [8]Я использую TXXX в VBScript(JScript),
наследник от TInterfacedObject не работает.
???
← →
Digitman (2001-12-24 17:18) [9]приведи строчку из скрипта, выполнение которой требует создания/использования экземпляра твоего объекта
← →
Romkin (2001-12-24 17:22) [10]Тебе нужен TAutoIntfObject, если type library не надо - делай сам потомка от TComObject с реализацией IDispatch
← →
АНАТОЛИЙ (2001-12-24 17:35) [11]1 ? for Romkin
КАК ПОЛУЧИТЬ ССЫЛКУ НА ITypeLib(необходимо при создании обьекта)
2 ? for DIGITMAN
а) В программе создается обьект TXXX(потомок TAutoObject),имеющий
интерфейс Ixxx c функцией TEST.
б) делаю доступным Ixxx для скрипта под именем DIGITMAN
В) в скрипте выполняется DIGITMAN.TEST
← →
Digitman (2001-12-24 17:43) [12]Наследуй TXXX от TInterfacedObject и реализуй в нем Ixxx = interface(IDispath)
← →
АНАТОЛИЙ (2001-12-24 17:48) [13]КАК РЕАЛИЗОВАТЬ Ixxx = interface(IDispath),
чтобы VBScript понимал вызов его функций
← →
Digitman (2001-12-24 17:55) [14]Почитай про фиксированные методы IDispath.GetIDsOfNames и IDispath.Invoke() и реализуй их в своем классе. Это все, что нужно для работы скрипта с любым объектом, предоставляющим диспинтерфейс.
← →
АНАТОЛИЙ (2001-12-24 17:56) [15]ГДЕ ПОЧИТАТЬ ?
← →
Romkin (2001-12-24 17:57) [16]???
Объект (внутренний) создается стандартно:
type
TFoo = class(TAutoObject, IFoo)...
var
AFoo: IFoo;
AFoo := TFoo.Create;
Тебе требуется для скрипта IDispatch, а у него есть подключение к TypeLib
Поэтому создавай AutoObject, и не мучайся
А ITypeLib - это проперти TComServer
← →
Digitman (2001-12-24 18:05) [17]А еще лучше - наследовать TXXX от TComponent и использовать, соответственно, TComponentFactory. Потому как TComponent уже реализует методы GetIDsOfNames() и Invoke().
← →
АНАТОЛИЙ (2001-12-25 16:28) [18]ВСЕМ СПАСИБО.
ВСЕ ПОЛУЧИЛОСЬ ЧЕРЕЗ НАСЛЕДНИКА TAutoIntfObject.
КОМУ ИНТЕРЕСНО МОГУ ПОКАЗАТЬ.
← →
GARIK_PR (2001-12-25 16:31) [19]Покажи, а вдруг пригодится, работа с COM объектами.
← →
АНАТОЛИЙ (2001-12-25 16:49) [20]ПРЕДВАРИТЕЛЬНО СОЗДАЙ 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:54) [21]Спасибо.
← →
АНАТОЛИЙ (2001-12-25 17:05) [22]EЩЕ ПРОБЛЕМА(САМ НЕ РЕШАЛ) ВОЗНИКЛА НА ХОДУ.
МОЖЕТ БЫТЬ КТО ОТВЕТИТ С ХОДУ.
ЗАГРУЖАЮ В ПРОЕКТЕ В РАЗНЫХ *.DCU НЕСКОЛЬКО *.TLB
{$R 1.TLB}
{$R 2.TLB}
ВОПРОС
КАК ПОЛУЧИТЬ ITypeLib НА НУЖНУЮ *.TLB
← →
АНАТОЛИЙ (2001-12-25 17:25) [23]САМ СЕБЕ
НЕ ПОЛУЧИЛОСЬ ЗАГРУЗИТЬ > 1 *.TLB
Delphi НЕ ДАЕТ
ЕСЛИ НЕ ХОЧЕТСЯ ТАЩИТЬ *.TLB за собой
НАДО РАБОТАТЬ ЧЕРЕЗ РЕСУРСЫ
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c