Вызов метода OLE-сервера с out-параметров типа widestring
Раздел: FastScript
Здравствуйте!
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, остается только заполнить правильными значениями её параметры.