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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.011 c
7-42583
ASTARD
2001-09-28 14:56
2002.01.14
Интересно!


1-42433
Scorpion_SJ
2001-12-23 22:04
2002.01.14
Помогите написать DLL ресурс


1-42515
Simonaln
2001-12-26 11:32
2002.01.14
Расстояние между строками в Memo


1-42490
Dodge
2001-12-25 02:33
2002.01.14
NMHTTP и MEMO


1-42512
ZEE
2001-12-26 02:11
2002.01.14
Фиксированная ширина Label