Pascal Script,如何将var参数从脚本返回到我的Delphi代码中?

时间:2016-11-04 19:00:28

标签: delphi pascalscript

我需要在我的Pascal脚本代码中修改函数参数变量(string),并在脚本完成它的工作后在Delphi函数中获取它。

我的脚本代码:

function OnBroadcastMessage(iCID, iUIN: integer; var sUsersList: string; dtActualTo: double; bMustRead, bReadNotify: boolean; sMsg: string): boolean;
begin
  sUsersList := '3';
  result := true;
end;

begin

end.

我的Delphi XE3代码(只是很小的例子,没有任何检查):

var
  Compiler: TPSPascalCompiler;
  Exec: TPSExec;
  ProcNo: cardinal;
  ParamList: TIfList;
  Data: AnsiString;
begin
  Compiler := TPSPascalCompiler.Create;
  Compiler.Compile(Script)
  Compiler.GetOutput(Data); 
  Compiler.Free;

  Exec.LoadData(Data);

  ProcNo := Exec.GetProc('OnBroadcastMessage');
  ParamList := TIfList.Create;

  ParamList.Add(@iCID);
  ParamList.Add(@iUIN);
  ParamList.Add(@sUsersList);
  ParamList.Add(@dtActualTo);
  ParamList.Add(@bMustRead);
  ParamList.Add(@bReadNotify);
  ParamList.Add(@sMsg);

  result := Exec.RunProc(ParamList, ProcNo);

  FreePIFVariantList(ParamList);
end;

这个解决方案错了,我在行“result:= Exec.RunProc(ParamList,ProcNo)”时遇到错误;“。

“Project mcserv.exe引发异常类$ C0000005,消息'访问冲突位于0x00a56823:读取地址0x0000000d'。”。

我怎么做错了?

1 个答案:

答案 0 :(得分:3)

您需要为字符串参数创建PPSVariant:

Param := CreateHeapVariant(fExec.FindType2(btString));
PPSVariantAString(Param).Data := AnsiString('test value');

另一种方法是使用Exec.RunProcPVar()方法。 您只需使用参数定义变量数组:

var
  vparams : array of Variant;
begin
  Compiler := TPSPascalCompiler.Create;
  Compiler.Compile(Script);
  Compiler.GetOutput(Data);
  Compiler.Free;

  Exec.LoadData(Data);

  ProcNo := Exec.GetProc('OnBroadcastMessage');

  SetLength(vparams, 7);
  vparams[0] := iCID;
  vparams[1] := iUIN;
  vparams[2] := sUsersList;
  vparams[3] := dtActualTo;
  vparams[4] := bMustRead;
  vparams[5] := bReadNotify;
  vparams[6] := sMsg;

  Result := Exec.RunProcPVar(vparams, procno);

end;