簡體   English   中英

如何創建PSafeArray類型的參數?

[英]How to create a parameter of type PSafeArray?

如何創建PSafeArray類型的參數?

我從C#COM庫中收到以下錯誤:

  SafeArray with range 65262 transfered to the method that requires array with range 1

Delphi XE2應該使用帶有參數Generated RIDL類型的Generated RIDL類型庫來調用C# COM library過程。

Delphi XE2代碼:

  function GetObjects: PSafeArray;
  var
    aObjects: Variant;
  begin
    aObjects := VarArrayCreate([0, 2], varVariant);
    aObjects[0] := ADOConnection.ConnectionObject;
    aObjects[1] := CashConnection;
    aObjects[2] := Self as IDispatch;
    Result := PSafeArray(TVarData(aObjects).VArray);
  end;

  ICompiler.Execute('MainNameSpace', 'MainClass', 'MainMethod', GetObjects);

C#COM庫代碼:

void Execute(string Namespace, string ClassName, string MethodName, Object[] Objects);

void ICSCompiler.Execute(string Namespace, string ClassName, string MethodName, Object[] Objects)
{
  System.Type _type = cr.CompiledAssembly.GetType(Namespace + "." + ClassName);
  System.Object obj = Activator.CreateInstance(_type);
  System.Reflection.MethodInfo mi = obj.GetType().GetMethod(MethodName);
  mi.Invoke(obj, new Object[] { Objects });
}

生成的RIDL代碼:

HRESULT _stdcall Execute([in] BSTR Namespace, [in] BSTR ClassName, [in] BSTR MethodName, [in] SAFEARRAY(VARIANT) Objects);

這段代碼可以正常工作:

  function GetObjects: PSafeArray;
  var
    aBounds: array [0..0] of TSafeArrayBound;
    aObjects: PSafeArray;
    aIndex: Integer;
    aConnectionObject: OleVariant;
    aCashConnection: OleVariant;
    aScript: OleVariant;
  begin
    aBounds[0].lLbound   := 0;
    aBounds[0].cElements := 3;
    aObjects := SafeArrayCreate(varVariant, 1, @aBounds);
    aIndex := 0;
    aConnectionObject := ADOConnection.ConnectionObject;
    OleCheck(SafeArrayPutElement(aObjects, aIndex, aConnectionObject));
    aIndex := 1;
    aCashConnection := CashConnection;
    OleCheck(SafeArrayPutElement(aObjects, aIndex, aCashConnection));
    aIndex := 2;
    aScript := Self as IDispatch;
    OleCheck(SafeArrayPutElement(aObjects, aIndex, aScript));
    Result := aObjects;
  end;

我記得的第一件事是SafeArrayCreate 看看“ PSafeArray奧秘

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM