OberonCore
https://forum.oberoncore.ru/

Подсистема Ctl (COM, DTC)
https://forum.oberoncore.ru/viewtopic.php?f=23&t=883
Страница 1 из 1

Автор:  hothing [ Понедельник, 18 Февраль, 2008 13:30 ]
Заголовок сообщения:  Подсистема Ctl (COM, DTC)

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

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

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

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

Автор:  Илья Ермаков [ Понедельник, 18 Февраль, 2008 13:53 ]
Заголовок сообщения:  Re: Подсистема Ctl (COM, DTC)

COM-методы действительно реализуются связанными процедурами. Компилятор чётко блюдёт порядок виртуальной таблицы по порядку объявления в модуле...

Автор:  hothing [ Понедельник, 18 Февраль, 2008 14:01 ]
Заголовок сообщения:  Re: Подсистема Ctl (COM, DTC)

Илья, огромное спасибо!

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

:evil:При работе с массивами COM BB ведет себя хуже всех сред разработки. Какого ляда вылетает сообщение о NIL dereference когда все указатели инициализированы? Какого ляда после этого сам Framework накрывается медным тазом?

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

Автор:  Евгений Темиргалеев [ Вторник, 23 Сентябрь, 2008 22:41 ]
Заголовок сообщения:  Re: Подсистема Ctl (COM, DTC)

Давайте пример, будем вместе думать.

Автор:  Иван Кузьмицкий [ Среда, 24 Сентябрь, 2008 06:38 ]
Заголовок сообщения:  Re: Подсистема Ctl (COM, DTC)

Если возможно, попутно бы узнать, что за компонент и какие задачи он призван решить?

Автор:  hothing [ Среда, 24 Сентябрь, 2008 09:00 ]
Заголовок сообщения:  Re: Подсистема Ctl (COM, DTC)

В двух словах: есть 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

Автор:  Евгений Темиргалеев [ Среда, 24 Сентябрь, 2008 09:56 ]
Заголовок сообщения:  Re: Подсистема Ctl (COM, DTC)

Млин, еще и какой-то сервер ставить. Откуда его взять-то, дайте ссылочку.

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

Автор:  hothing [ Среда, 24 Сентябрь, 2008 10:06 ]
Заголовок сообщения:  Re: Подсистема Ctl (COM, DTC)

Евгений спасибо за ссылку - похоже оно самое. Попробую для версии 1.6...

Test passed!

Автор:  hothing [ Четверг, 27 Ноябрь, 2008 16:53 ]
Заголовок сообщения:  Re: Подсистема Ctl (COM, DTC)

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;

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/