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;
我需要在我的 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;