Главная страница
    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.005 c
1-42498
Alan
2001-12-25 19:16
2002.01.14
Проблемка с постоянным отображением подсказки


4-42611
Kan
2001-11-14 11:36
2002.01.14
Самоуничтожающаяся программа


14-42567
Anatoly Podgoretsky
2001-11-18 17:08
2002.01.14
TOP TEN


4-42635
Tasadar
2001-11-10 13:29
2002.01.14
Как узнать о том что переименовали файл


6-42528
Робот
2001-10-18 16:09
2002.01.14
Нужен почтовый робот,





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский