[英]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.