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

Вниз

Помогите побороть 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
3-10630
Alex Bredin
2003-08-13 10:51
2003.09.04
Синхронизация БД через Интернет


14-10897
новичёк
2003-08-04 22:53
2003.09.04
Алгоритмы распознавания образов


3-10569
M126
2003-08-15 13:04
2003.09.04
Ошибка Query


14-10873
copyr25
2003-08-14 16:41
2003.09.04
HELP ME ПЛИИЗ!


1-10781
Anton Lagutin
2003-08-23 11:59
2003.09.04
Заголовки