Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];

Вниз

Помогите побороть Automation-сервер! Очень нужно!   Найти похожие ветки 

 
BlackTiger   (2003-08-21 13:05) [0]

Столкнулся со странной проблемой.
Есть у меня накая type-library (назовем ее AutoSvr.tlb). Самое грустное, что кроме ее нет больше ничего, т.е. самого приложения нет. Я ее зарегестрировал вроде нормально, все (я так думаю) прописалось. Далее импортирую ее в Дельфу - полет нормальный.
А вот дальше начинаются танцы.
Файл AutoSvr_TLB.pas содержит некий набор классов. А конкретно - TAutoClass, IAutoClass, AutoClass, CoAutoClass. Вот тут я начинаю путаться. Задача такая - мне нужно создать объект (подключиться к automation-серверу), вызвать методы и отключиться. Судя по литературе, мне нужно сделать следуюшее:

var
Svr : IAutoClass;
begin
try
Svr := CoAutoClass.Create;
Svr.SomeMethod(SomeParams);
Svr := nil;
except
{... обработка ошибок ...}
end;
end;

Все компилится нормально. Проверить у себя не могу. Отсылаю тем, где это должно работать. У них вылезает ошибка "Class not registered". Ладно, думаю. Создаю аналог в VB6 с кодом:

Dim Svr As AutoSvr.AutoClass
Set Svr = CreateObject("AutoSvr.AutoClass")
Svr.SomeMethod SomeParams
Set Svr = Nothing

Отправляю им EXEшник. Все работает! Ну что ему не нравится?!?!?!? Может я чего не понял в работе "OLE Automation".

Для меня это вопрос жизни и смерти. Люди, помогите. Ну очент нужно разобраться! Дело еще усложняется и тем, что заказчик работает на Delphi5, а у меня есть только Delphi6/7.


 
Юрий Федоров   (2003-08-21 13:11) [1]

То есть ты написал объект (coClass), который реализует интерфейс(ы), которые объявлены в библиотеке, которая лежит отдельным файлом (без приложения), и зарегистрирована, так я понял ?


 
BlackTiger   (2003-08-21 13:17) [2]

Ну, CoAutoClass создал дельфийский визард, импортирующий TLB.

Не знаю, может нужно использовать CreateOleObject?

Не могу понять, почему в VB все работает, а в Delphi - нет.


 
Skier   (2003-08-21 13:21) [3]

var
AAutoSvr : Variant;
begin
//.............
AAutoSvr := CreateOleObject("AutoSvr.AutoClass");
AAutoSvr.SomeMethod(SomeParams);
//.............
end;

Не поможет ?


 
BlackTiger   (2003-08-21 14:30) [4]

2Skier:
Помогло. Спасибо. Неудобно только то, что не доступен список методов и свойств объекта. Может можно как-то преобразовать Variant к моему типу объекта? Приходится спрашивать, т.к. работать приходится вслепую.

Может кто объяснит мне, чем отличается CreateOleObject от моего первого способа (Svr := CoAutoClass.Create). Я не специалист в таких тонкостях, но мне кажется второй способ - позднее связывание, а это довольно накладный способ взаимодействия. Это так?
Могу ли я переменной сразу задать нужный мне тип или я должен работать только через Variant?

И зачем Дельфи создает свой тип (TAutoClass, CoAutoClass), свой интерфейс (IAutoClass), если работать приходится только через variant?


 
Serginio666   (2003-08-21 14:44) [5]

Посмотри исходники этих функций и почитай про СОМ


 
BlackTiger   (2003-08-21 14:59) [6]

2Serginio666:
Я бы с радостью, но в данный момент нет времени. Засяду, когда появится немного времени. Потому и прошу максимально сжатого ответа/совета от людей, которые с этим работают.


 
Zelius   (2003-08-21 16:01) [7]

CreateOleObject - создает объект и возвращает IDispatch интерфейс, так называемое позднее связывание, это как Бейсик работает;
CoAutoClass.Create - раннее связывание, работает быстрее, плюс есть проверка всех типов при вызове.
Вообще тебе надо разбираться, почему у них вылетает ошибка, какой клас не зарегистрирован, и тогда можно работать через CoAutoClass.Create.


 
BlackTiger   (2003-08-21 17:54) [8]

Я пробовал использовать RegMon во время попытки инициализации объекта. Он мне честно показал какой GUID и где он ищет. Но по такому пути такого GUIDа не существует. А так как я не имею доступа непосредственно к телу, то приходится тренироваться в нанайских танцах :).

А какой вообще может быть причина того, что позднее связывание работает, а раннее - нет? А вот насчет того, что VB использует позднее связывание - не совсем согласен, хотя модет чего-то и путаю. Я же не работаю с типизированным объектом, а не с variant-ом. Или в VB все объекты имеют интерфейс IDispatch?


 
BlackTiger   (2003-08-21 17:59) [9]

Очепятка, читать надо как:
Я же работаю с типизированным объектом


 
Zelius   (2003-08-21 18:08) [10]


> BlackTiger (21.08.03 17:54) [8]

Посмотри, чей это гуид, класса, интерфейса, билбы типов...
Может у клиента класс зарегистрирован, а библиотека типов нет! ТО есть он может добраться до IDispatch.
Помоему в VB все через ИДиспатч.

Но я уже давно не брал в руки шашек, поэтому могу и ошибаться.


 
BlackTiger   (2003-08-21 19:24) [11]

Господа! А ведь есть еще и CreateComObject. Он, правда, принимает только TGUID в качестве описания компонента.

А можно ли IDispatch привести к нужному мне типу?


 
Zelius   (2003-08-21 19:32) [12]


> BlackTiger (21.08.03 19:24) [11]

Попробуй применить as: Svr := IDispatch(dispSvr) as IAutoClass;



Страницы: 1 вся ветка

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

Наверх





Память: 0.47 MB
Время: 0.009 c
1-10760
vv_fran
2003-08-23 17:26
2003.09.04
Переобразование сетевого имени файла


1-10821
Mazer
2003-08-21 19:01
2003.09.04
Перенос процедур главного модуля в несколько других...


14-10868
Zip
2003-08-18 07:18
2003.09.04
globals.pas


3-10572
Denkop
2003-08-14 12:46
2003.09.04
Связи посредством SQL


3-10553
galexis
2003-08-11 16:29
2003.09.04
SQL запрос на последнюю дату внесения





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