Pascal 脚本,如何将脚本中的 return var 参数转换为我的 Delphi 代码?

Pascal Script, how to return var parameter from script into my Delphi code?

我需要在我的 Pascal 脚本代码中修改函数参数变量(字符串)并在 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 raised exception class $C0000005 with message 'access violation at 0x00a56823: read of address 0x0000000d'.".

我怎么做错了?

您需要为字符串参数创建 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;