代码之家  ›  专栏  ›  技术社区  ›  Sebastian

如何使用psafariarray从Delphi调用带有数组的.NET COM方法?

  •  0
  • Sebastian  · 技术社区  · 16 年前

    我有一个.NET(4.0)接口,它是用 ServicedComponent COM+类:

    interface DotNetIface
    {
        void MethodRef(var System.Guid guid);
        void MethodArray(System.Guid[] guids, params object[] parameters);
        void MethodCStyle([MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.Struct, SizeConst=5)]System.Guid[] guids);
    }
    

    现在我使用Delphi2007导入向导导入类型库,如预期的那样 我得到以下签名:

    procedure MethodRef(var guid : TGuid);
    procedure MethodArray(guids : PSafeArray);
    procedure MethodCStyle(var guids : ClrGuid /* from mscorlib_TLB */);
    

    如果我现在这样调用“ref”方法,它可以正常工作:

    procedure CallByRef(guid : TGuid);
    var
        test : TGuid;
    begin
        test := ...
        comRef.MethodRef(guid);
    end;
    

    现在我还需要数组方法

    procedure CallArray();
    var
        localGuid : TGuid;
        arrayVariant : OleVariant;
    begin
        arrayVariant := VarArrayCreate([0,4], varVariant /* dont know here */);
        arrayVariant[0] := localGuid; /* compile error, cannot cast implicitly */
    
        comRef.MethodArray(PSafeArray(TVarData(arrayVariant.VArray)), /* here this object... PSafeArray works actually*/);
    end;
    

    最后我用了C数组

    procedure CallCStyle();
    var
        localGuid : TGuid;
        arrayOfGuid : array [0..4] of ClrGuid;
    begin
        arrayOfGuid[0] := ClrGuid(localGuid);
    
        comRef.MethodCStyle(PSafeArray(/* now i dont know put it*/, /* here this object... PSafeArray works actually*/);
    end;
    

    我真的不知道该怎么做。 我希望有人对通信编组有更多的经验 谢谢

    侧节点:

    我找到了我认为可以被传给safearraycreate的vt clsid,但我不知道该如何起诉它。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Robert Love    16 年前

    我从未尝试过你需要的东西,但快速搜索发现以下文章: