2016-11-04 5 views
-1

Мне нужно изменить переменную параметра параметра (string) в моем коде сценария Pascal и получить ее в функции Delphi после завершения скрипта.Pascal Script, как вернуть параметр 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; 

Это решение было неправильным, я получил сообщение об ошибке в строке " result: = Exec.RunProc (ParamList, ProcNo); ".

«Проект mcserv.exe повышен класс исключений $ C0000005 с сообщением« нарушение доступа в 0x00a56823: чтение адреса 0x0000000d ».».

Как я ошибаюсь?

+5

* получил ошибку * совершенно бесполезно, если вы не говорите нам, что ошибка, которую вы получите. Что такое ** точное сообщение об ошибке, которое вы получаете? –

+0

Извините. Кен. Текст ошибки: «Project mcserv.exe поднял класс исключений $ C0000005 с нарушением доступа к сообщению при 0x00a56823: чтение адреса 0x0000000d.». – HobitZlobny

+1

Я никогда не использовал скрипт Pascal, но я вижу, что 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