Вызов метода OLE-сервера с out-параметров типа widestring

Здравствуйте!


OLE-сервер имеет метод:

  • GetDate(out Date: WideString)

могу ли я получить значение из этого метода через переменную Date в FastScript 1.9 (FastReport 4.15) ?

Пробую:


var VarDevice :OLEVariant;

  resultval :string;

begin

 VarDevice := CreateOleObject('OPOS.FiscalPrinter.1.12');

.....

 VarDevice.GetDate(resultVal);

 showmessage(ResultVal);

end;


В результате ошибок не получу, но resultval будет пуст. Вроде бы должно работать, если бы не widestring? Или я в принципе не могу таким образом к методу обратиться? Может быть какие-то обходные пути есть?


Выполнение в откомпилированном экзешнике результаты дает какие надо, то есть последовательность действий при обращении к объекту правильная.

Комментарии

  • Забыл добавить: Delphi XE

  • Попробуйте

    function TForm17.CallMethod1(Instance: TObject; ClassType: TClass;

    const MethodName: String; Caller: TfsMethodHelper): Variant;

    var VarDevice :OLEVariant;

    IntVal :integer;

    ResultVal :widestring;

    begin

    if MethodName = 'METHOD1' then

    begin

    VarDevice := CreateOleObject('Project16.Test1');

    IntVal := Caller.Params[0];

    VarDevice.Method1(IntVal, ResultVal);

    Result := ResultVal;

    end;

    end;


    procedure TForm17.Button4Click(Sender: TObject);

    var Script :TfsScript;

    begin

    Script := TfsScript.Create(nil);

    try

    Script.AddRTTI;

    Script.AddMethod('function Method1(IntVal: integer): String', CallMethod1);

    script.Lines.text :=

    'var VarDevice :Variant;'+slinebreak+

    ' IntVal :Variant;'+slinebreak+

    ' ResultVal : Pointer;'+slinebreak+

    'begin'+slinebreak+

    ' ResultVal := ''?'';'+slinebreak+

    ' IntVal := -10;'+slinebreak+

    ' ResultVal := Method1(IntVal);'+slinebreak+

    ' showmessage(''IntVal=''+inttostr(IntVal));'+slinebreak+

    ' showmessage(''ResultVal=''+ResultVal);'+slinebreak+

    'end.';

    if not Script.Compile then showmessage('Ошибка: '+script.ErrorMsg)

    else Script.Execute;

    finally

    script.free;

    end;

    end;

  • Спасибо за идею, мне техподдержка точно так и предложила.

    Однако это частное решение, которое придётся зашивать в экзешник, используя возможности позднего связывания в нем самом. Когда потребуется реализация другого OLE-объекта, придется и для него функцию прописывать. То есть в экзешник зашивается конкретная реализация. Но тогда непонятно, зачем тут вообще был нужен FastScript. Идея использования скриптов в приложениях в том и состоит, чтобы экзешник понятия не имел, как происходит работа с периферией (в моем случае это работа с ККМ) , он имеет стандартный набор функций, которые описаны внутри скрипта, и ничего не знает про то, как это реализовано. Тут очевидно другое решение: реализовываем функцию, в которую передается OLE-объект, имя функции, которую надо выполнить, и массив переменных, которые засунутся в эту функцию и вернутся обратно. Ну, и описание этой функции в фастскрипте. Так мы получаем доступ к любым методам любых OLE-объектов, возвращающим значения в параметрах. В методе же вызывается DISPATCH.Invoke, остается только заполнить правильными значениями её параметры.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.