Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Общие вопросы > OPC Server


Автор: Emmys 21.05.17, 10:16
Добрый день!
скачал пример OPC Server. Скачал софт OPC Matricon. в нем я вижу свой сервер, могу к нему подключится и получать данные клиентом Matricon Explorer
Единственное где я получаю ошибку это вызов названий транслируемых тегов. если прописать название тегов ручками в Matricon Explorer, то данные идут.
помогите пожалуйста разобраться с ошибкой.

скрин ошибки: https://yadi.sk/d/GMBUUv0Q3JNLwY
Исходник: https://yadi.sk/d/Fr0GDODq3JNLyg
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    type
      TOPCStringsEnumerator = class(TComObject, IEnumString)
      private
        nextIndex:Integer;
        strList:TStringList;
      public
        constructor Create(const inStrings: TStringList);
        destructor Destroy;override;
     
       function Next(celt: Longint; out elt; pceltFetched: PLongint): HResult; stdcall;
    //функция  //функция //функция  //функция //функция  //функция
     
     
        function Skip(celt: Longint): HResult; stdcall;
        function Reset: HResult; stdcall;
        function Clone(out enm: IEnumString): HResult; stdcall;
      end;
     
     
    function TOPCStringsEnumerator.Next(celt: Longint; out elt; pceltFetched: PLongint): HResult;
    var
     i: integer;
    begin
     i:=0;
     if celt < 1 then
      begin
       Result:=RPC_X_ENUM_VALUE_OUT_OF_RANGE;
       Exit;
      end;
     if pceltFetched = nil then
      begin
       Result:=E_INVALIDARG;
       Exit;
      end;
     
     Result := S_FALSE;
     while (i < celt) do
      begin
       if (nextIndex < strList.Count) then
        begin
         TPointerList(elt)[i]:=StringToLPOLESTR(strList[nextIndex]);
         Inc(i);
         Inc(nextIndex);
        end
       else
        begin
         Result:=RPC_X_ENUM_VALUE_OUT_OF_RANGE;
         Break;
        end;
      end;

Автор: Emmys 21.05.17, 12:08
только что заметил что в Delphi XE работает,а в Delphi 10.2 нет

в Delphi XE: TPointerList = array[0..MaxListSize - 1] of Pointer;
в Delphi 10.2: TPointerList = array of Pointer;

может кто подскажет как поправить?

Автор: leo 22.05.17, 03:41
Если не править исходник модуля, то просто отключить в свойствах проекта Range checking.
Или же заменить в исходнике TPointerList на PointerArray

Автор: Emmys 22.05.17, 14:49
Огромнейшее спасибо. несколько дней разбирался до этого безрезультатно.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)