2012-05-28 96 views
1

如何创建PSafeArray类型的参数?如何创建PSafeArray类型的参数?

我采取以下错误从C#COM库:

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

Delphi XE2应该使用Generated RIDL类型库用类型PSafeArray的参数调用C# COM library过程。

德尔福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); 

回答

3

此代码工作正常:

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; 
相关问题