OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 16 Июнь, 2025 02:09

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Подсистема Ctl (COM, DTC)
СообщениеДобавлено: Понедельник, 18 Февраль, 2008 13:30 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 252
Откуда: Austria, Bruck
Появилась задача использовать некоторый СОМ-компонет. Причем компонент даульный (т.е. поддерживает IDispatch + vtbl). Сгенерировал для него модуль заглушку с помощью DevComInterfaceGen.GenCustomInterface. Посмотрел код, и тут меня сомнения взяли, что генерируется код для VTBL, а не для IDispatch->Invoke.

Основа сомнений - это присоединенные функции, а ля методы класса. В СОМ ведь очень важен порядок функций в VTBL, а следовательно порядок объявления процедур 1:1 должен соответствовать порядку методов в VTBL. Что-то я не уверен в том, что компилятор следует этому правилу.

Кто нибудь может внести ясность? Как вообще работает ЧЯ с СОМ? В документации не много информации.

Често говоря, очень не хочется руками лопатить громадный хидер компоненты, чтобы написать заглушку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсистема Ctl (COM, DTC)
СообщениеДобавлено: Понедельник, 18 Февраль, 2008 13:53 
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
COM-методы действительно реализуются связанными процедурами. Компилятор чётко блюдёт порядок виртуальной таблицы по порядку объявления в модуле...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсистема Ctl (COM, DTC)
СообщениеДобавлено: Понедельник, 18 Февраль, 2008 14:01 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 252
Откуда: Austria, Bruck
Илья, огромное спасибо!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсистема Ctl (COM, DTC)
СообщениеДобавлено: Вторник, 23 Сентябрь, 2008 17:13 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 252
Откуда: Austria, Bruck
:evil:При работе с массивами COM BB ведет себя хуже всех сред разработки. Какого ляда вылетает сообщение о NIL dereference когда все указатели инициализированы? Какого ляда после этого сам Framework накрывается медным тазом?

И кстати, вот тут и понимаеш, что отладчик бы не помешал....


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсистема Ctl (COM, DTC)
СообщениеДобавлено: Вторник, 23 Сентябрь, 2008 22:41 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Давайте пример, будем вместе думать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсистема Ctl (COM, DTC)
СообщениеДобавлено: Среда, 24 Сентябрь, 2008 06:38 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Если возможно, попутно бы узнать, что за компонент и какие задачи он призван решить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсистема Ctl (COM, DTC)
СообщениеДобавлено: Среда, 24 Сентябрь, 2008 09:00 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 252
Откуда: Austria, Bruck
В двух словах: есть COM-компонент, так называемий OPC-сервер, основная функция которого предоставить стандартное API для доступа к данним (в основном, к ПЛК). Функционирует в 2-х режимах: синхронном и асинхронном. Первий режим прост: вызывается метод чтения\записи данных, и пока она выполняется программа стоит. Во втором режиме метод чтения\записи только инициирует запрос, а дальше компонент ждет пока данние будут считаны\записаны. Программа в это же время может работать дальше и просто ожидает события (данние считаны\записаны) от компонента.
... для работы нужен OPC сервер (предпологаю любой).
Работает все нормально пока не активируются события OPC-сервера. После этого поведение меняется кардинально. Нет я понимаю, что возможны ошибки в сервере. Но возникает 2 вопроса: почему даже в Питоне это работает и почему рушится ББ?
What is OPC? http://www.iconics.com/support/PDFs/OPC ... 0_auto.pdf


Вложения:
OPCSiemensDAAutomation.odc [35.83 КБ]
Скачиваний: 751
TestOPC.odc [7.99 КБ]
Скачиваний: 752
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсистема Ctl (COM, DTC)
СообщениеДобавлено: Среда, 24 Сентябрь, 2008 09:56 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Млин, еще и какой-то сервер ставить. Откуда его взять-то, дайте ссылочку.

И еще момент - Вы патч для Ctl не пробовали исп-ть? http://oberoncore.ru/index.php?option=c ... 7&Itemid=9. Была ошибка с NIL dereference:
Цитата:
Если CtlT.IDispatch выступал в качестве [in, out] параметра, то начальное значение NIL, приводило к "NIL dereference read"...
Может дело в том же?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсистема Ctl (COM, DTC)
СообщениеДобавлено: Среда, 24 Сентябрь, 2008 10:06 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 252
Откуда: Austria, Bruck
Евгений спасибо за ссылку - похоже оно самое. Попробую для версии 1.6...

Test passed!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Подсистема Ctl (COM, DTC)
СообщениеДобавлено: Четверг, 27 Ноябрь, 2008 16:53 

Зарегистрирован: Среда, 31 Октябрь, 2007 18:58
Сообщения: 252
Откуда: Austria, Bruck
Notes
Компилятор DTC имеет ошибку при генерации функций-заглушек для методов с out параметрами. Править компилятор лень, но есть рецепт ручного лечения.
Итак, в функции с out параметрами, все out аргументу обявлятся как VAR.
Было:
Код:
PROCEDURE (this: IS7ProSim) ReadFlagValue* (ByteIndex: INTEGER; BitIndex: INTEGER; DataType: PointDataTypeConstants; pData: CtlT.Any), NEW;

Стало:
Код:
PROCEDURE (this: IS7ProSim) ReadFlagValue* (ByteIndex: INTEGER; BitIndex: INTEGER; DataType: PointDataTypeConstants; VAR pData: CtlT.Any), NEW;

Для всех out-аргументов вызывается функция
Код:
CtlC.RefAnyVar(arg[<i>], arg[<i>]);

Где <i> - номер аргумента.
После вызова функции
Код:
CtlC.CallParMethod(this, 26, arg, NIL);

Добавляется код:
Код:
pData := CtlC.VarAny(arg[<i>]);
ASSERT(pData # NIL);

И самое главное - правится процедура CtlC.CallParMethod(...);
Код:
PROCEDURE CallParMethod* (obj: CtlT.Object; id: INTEGER; VAR arg: ARRAY OF CtlT.Variant;
                                 OUT [nil] ret: CtlT.Variant);
      VAR
         res: COM.RESULT;
         par: WinOleAut.DISPPARAMS;
         param: INTEGER;
         error: WinOleAut.EXCEPINFO;
         refPars: ARRAY 50 OF WinOleAut.VARIANTARG;
         cntRefs: INTEGER;
         i, j: INTEGER;
   BEGIN
      par.rgvarg := arg; par.cNamedArgs := 0; par.cArgs := LEN(arg);
      
      FOR i:=0 TO par.cArgs-1 DO
         IF BITS(par.rgvarg[i].vt) * BITS(WinOle.VT_BYREF) # {} THEN
            par.rgvarg[i].u.pvarVal := SYSTEM.ADR(refPars[i]);
         END;
      END;
      res := obj.disp.Invoke(id, nullid, CtlT.lcid, 1, par, ret, error, param);
      IF res < 0 THEN ShowError(res, error, par.cArgs - param) END;
      FOR i:=0 TO par.cArgs-1 DO
         IF BITS(par.rgvarg[i].vt) * BITS(WinOle.VT_BYREF) # {} THEN
            arg[i] := par.rgvarg[i].u.pvarVal;
         ELSE
            res := WinOleAut.VariantClear(par.rgvarg[i])   
         END;            
      END;
   END CallParMethod;


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB