2016-11-04 30 views
-1

我需要修改我的Pascal腳本代碼中的函數參數變量(字符串),並在腳本完成工作後將其獲取到Delphi函數中。帕斯卡爾腳本,如何將var參數從腳本返回到我的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; 

該解決方案是錯誤的,我得到了在線路錯誤「結果:= Exec.RunProc(ParamList,ProcNo);「。

「Project mcserv.exe引發異常類$ C0000005,消息'0x00a56823訪問衝突:讀取地址0x0000000d'。」。

我該怎麼做?

+5

*出錯*完全沒用,除非你告訴我們你得到了什麼錯誤。什麼是你正在得到的**精確**錯誤信息? –

+0

對不起。肯。錯誤文本:「項目mcserv.exe引發異常類$ C0000005與消息'訪問衝突在0x00a56823:讀取地址0x0000000d'」。 – HobitZlobny

+1

我從來沒有使用Pascal腳本,但我可以看到Exec尚未初始化。嘗試執行:= tPSExec.Create; –

回答

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; 
+0

非常感謝,一切正常! – HobitZlobny

相關問題