Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.004 c
1-42411
Bar
2001-12-25 20:34
2002.01.14
GetVolumeInformation неодинаково ведет себя под 98/Me и NT


14-42560
VEG
2001-11-18 22:34
2002.01.14
Крупный шрифт


4-42613
Karan
2001-11-14 14:19
2002.01.14
DLL<->Variant


14-42559
fliz
2001-11-19 10:43
2002.01.14
Монитор полетел.


1-42471
dimonf
2001-12-24 17:15
2002.01.14
Как быстро выводить (прорисовывать) графическую информацию на Canvas?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский