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) |
![]() И кстати, вот тут и понимаеш, что отладчик бы не помешал.... |
Автор: | Евгений Темиргалеев [ Вторник, 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
|
Автор: | Евгений Темиргалеев [ Среда, 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/ |