2016-11-04 17 views
-1

Pascal Scriptコードで関数の変数variable(string)を変更して、スクリプトが終了した後にDelphi関数で取得する必要があります。パスカルスクリプト、私のDelphiコードにスクリプトからvarパラメータを返す方法?

私のスクリプトコード:

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); "

"プロジェクトmcserv.exeは例外クラス$ C0000005を発生させ、 'アクセス違反は0x00a56823:0x0000000d'になりました。"

どうしたのですか?

+5

*エラーが発生しました*あなたは何を得るのエラーを教えない限り、全く役に立ちません。 **正確なエラーメッセージは何ですか? –

+0

申し訳ありません。ケン。エラーテキスト: "プロジェクトmcserv.exeは例外クラス$ C0000005を発生させました。 '0x00a56823でアクセス違反が発生しました:アドレス0x0000000d'が読み込まれました。" – HobitZlobny

+1

私はPascalスクリプトを使ったことがありませんが、私はExecが初期化されていないことがわかります。 Execを試してください:= tPSExec.Create; –

答えて

3

あなたは、文字列パラメータのPPS​​Variantを作成する必要があります。

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

関連する問題