delphi – 如何转换数据类型以调用COM过程?
发布时间:2020-12-15 09:36:22 所属栏目:大数据 来源:网络整理
导读:我有一个需要使用COM调用的过程,在C#中声明如下: void DoSomething (string param1,string[] param2,Object[] param3) 导入的TypeLibrary中的Delphi声明是: procedure DoSomething (param1: System.Widestring,param2: ActiveX.PSafeArray,param3: ActiveX
我有一个需要使用COM调用的过程,在C#中声明如下:
void DoSomething (string param1,string[] param2,Object[] param3) 导入的TypeLibrary中的Delphi声明是: procedure DoSomething (param1: System.Widestring,param2: ActiveX.PSafeArray,param3: ActiveX.PSafeArray); param1只是一个字符串. 示例:arg1:Double = 1.23,arg2:integer = 10. 到目前为止,我有这个代码将param2 []转换为PSafeArray: var param2: array of string; i: integer; va_param2: Variant; psa_param2: Activex.PSafeArray; begin SetLength (param2,2); param2 [0] := 'arg1'; param2 [1] := 'arg2'; // Create VariantArray,copy data va_param2 := VarArrayCreate ([0,Length(param2)-1],varOleStr); for i := 0 to Length(param2)-1 do va_param2 [i] := param2 [i]; // Convert VariantArray to PSafeArray psa_param2 := PSafeArray (TVarData (va_param2).VArray); end; 现在我应该为param2安装PSafeArray. 由于我无法在param2和param3设置之前调用COM过程,因此我也无法确定上面的代码是否正在执行我需要的操作. 解决方法
默认情况下,.NET对象被封送为COM VARIANT,除非使用MarshalAs语法在C#代码中明确指定为IUnknown或IDispatch.
试试这个: var param2: array of string; param3: array of Variant; i: integer; va_param2: Variant; va_param3: Variant; psa_param2: Activex.PSafeArray; psa_param3: Activex.PSafeArray; begin SetLength (param2,2); param2 [0] := 'arg1'; param2 [1] := 'arg2'; SetLength (param3,2); param3[0] := 1.23; param3[1] := 10; // Create arrays,copy data va_param2 := VarArrayCreate ([Low(param2),High(param2)],varOleStr); for i := Low(param2) to High(param2) do va_param2 [i] := param2 [i]; va_param3 := VarArrayCreate ([Low(param3),High(param3)],varVariant); for i := Low(param3) to High(param3) do va_param3 [i] := param3 [i]; // Convert arrays to PSafeArray psa_param2 := PSafeArray (TVarData (va_param2).VArray); psa_param3 := PSafeArray (TVarData (va_param3).VArray); ... end; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |