Как преобразовать типы данных для вызова процедуры COM?

У меня есть процедура, которую мне нужно вызвать с помощью COM, который объявлен как это в С#:

void DoSomething (string param1, string[] param2, Object[] param3)

Объявление Delphi в импортированной TypeLibrary:

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;

Теперь у меня должен быть PSafeArray для param2.
Но как я могу это сделать для param3 []?
Будут разные типы данных, а не только строки.

Так как я не могу вызвать COM-процедуру до того, как param2 и param3 настроены, я также не могу быть уверен, что приведенный выше код делает то, что мне нужно.
Он работает, но правильно ли я делаю эти преобразования для передачи результата в описанную выше процедуру COM?

+4
07 июн. '12 в 16:25
источник поделиться
1 ответ

По умолчанию .NET Object маршалируется как COM VARIANT, если явно не указано как IUnknown или IDispatch в коде С# с использованием синтаксиса MarshalAs.

Попробуйте следующее:

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; 
+9
07 июн. '12 в 20:43
источник

Посмотрите другие вопросы по меткам или Задайте вопрос