如何转换数据类型以调用COM过程?

时间:2012-06-07 16:25:41

标签: delphi com delphi-xe2

我有一个需要使用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过程?

1 个答案:

答案 0 :(得分:9)

默认情况下,.NET Object被封送为COM VARIANT,除非使用{{1}在C#代码中明确指定为IUnknownIDispatch语法。

试试这个:

MarshalAs