Delphi передает несколько параметров в IActiveScript IDispatch.Invoke
Используя Delphi 11.1, я хочу добавить сценарии в свое приложение с помощью IActiveScript. Я создал небольшой VBScript для проверки передачи нескольких параметров из Delphi в скрипт:
Function TestParams(a, b, c)
TestParams = c
End Function
Сценарий VB загружается нормально, но у меня возникают проблемы с передачей нескольких параметров. Дельфийский код:
procedure TForm1.Button14Click(Sender: TObject);
var
v: OleVariant;
Disp: IDispatch;
Arg: TArray<TVariantArg>;
Res: OleVariant;
DispParams: TDispParams;
i,n: Integer;
s: string;
begin
v := VarArrayOf(['Wrong...', 'huh', 'OK!']);
s := 'TestParams';
Memo2.Lines.Text := VarToStr(MyScriptingHost1.Run('TestParams', v));
exit;
OleCheck(MyScriptingHost1.FScript.GetScriptDispatch(nil, Disp));
OleCheck(Disp.GetIDsOfNames(GUID_NULL, @s, 1, 1033, @n));
setlength(arg, 3);
for i := 0 to High(Arg) do
begin
n := High(Arg) - i;
Arg[n].vt := VarType(v[i]);
Arg[n].bstrVal := PWideChar(VarToWideStr(v[i]));
end;
//At this point, my Delphi 11.1 assignes the same value to Arg[]0, Arg[1], arg[2]
//this works
//Arg[0].vt := VT_BSTR;
//Arg[0].bstrVal := 'test3';
//
//Arg[1].vt := VT_BSTR;
//Arg[1].bstrVal := 'test2';
//
//Arg[2].vt := VT_BSTR;
//Arg[2].bstrVal := 'test1';
DispParams.rgvarg := @Arg[0]; //@Arg gives error
DispParams.rgdispidNamedArgs := nil;
DispParams.cArgs := High(Arg) + 1;
DispParams.cNamedArgs := 0;
//passing pointer to DispParams gives errors
OleCheck(Disp.Invoke(n, GUID_NULL, 1033, DISPATCH_METHOD, DispParams, @res, nil, nil));
end;
По какой-то причине несколько параметров дают разные результаты для 32/64 бит, и, используя приведенный выше код, все параметры обычно получают одно и то же значение. Очень странно.
Еще более странно, что выполнение этого несколько раз дает иногда разные результаты.
Приведенный выше код работает без проблем только в случае 1 параметра.
Кто-нибудь знает, что здесь не так?