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 параметра.

Кто-нибудь знает, что здесь не так?

0 ответов

Другие вопросы по тегам