Форум: "Основная";
Текущий архив: 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