Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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 за собой
НАДО РАБОТАТЬ ЧЕРЕЗ РЕСУРСЫ




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.14;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.037 c
3-42381           EsKor                 2001-12-11 07:38  2002.01.14  
Delphi и Visual FoxPro


1-42519           Andrey196             2001-12-26 16:15  2002.01.14  
Как из события одново компонента вызвать событие другово компонета


1-42448           Aleksandr             2001-12-24 18:11  2002.01.14  
Млин, все тот же Excel...


1-42418           Wetnose               2001-12-27 07:09  2002.01.14  
KeyDown для ScrollBar a


1-42409           Елена                 2001-12-24 00:40  2002.01.14  
Help!