2016-11-04 7 views
-1

내 파스칼 스크립트 코드에서 함수 매개 변수 variable (string)을 수정하고 스크립트가 작업을 마친 후에 델파이 함수에서 가져와야합니다. 파스칼 스크립트, 어떻게 내 델파이 코드로 스크립트에서 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. 

내 델파이 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

저는 파스칼 스크립트를 한번도 사용하지 못했지만, Exec이 초기화되지 않았 음을 알 수 있습니다. 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