加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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只是一个字符串.
param2是一个参数名称数组,比方说:[‘arg1′,’arg2’].
param3是这些参数的相应值.

示例:arg1:Double = 1.23,arg2:integer = 10.
这将导致:
– param2:[‘arg1′,’arg2’]
– param3:[1.23,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.
但是我如何为param3 []做到这一点?
将有不同的数据类型,而不仅仅是字符串.

由于我无法在param2和param3设置之前调用COM过程,因此我也无法确定上面的代码是否正在执行我需要的操作.
它运行,但我是否正确地将这些转换传递给上面的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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读