Как преобразовать элемент PSafeArray в исходный тип - PullRequest
0 голосов
/ 27 октября 2009

Я использую COM в Delphi 7, который был создан в C#, и один из методов класса возвращает массив типа. Однако, когда Delphi импортирует его, вместо массива этого типа я получаю PSafeArray.

Как я могу привести элементы этого массива в его базовый тип?

Я пытался использовать SafeArrayGetElement, но не смог найти способ приведения предмета в исходный тип.

Ответы [ 2 ]

1 голос
/ 25 марта 2011

Я не уверен, почему вам нужно выполнять кастинг, поскольку SafeArrayGetElement сделает это за вас. Пример:

var
  Scope : ICOMScope;
  LBound, UBound, I : Integer;
begin
  SafeArrayGetLBound(fMyComObject.Scopes, 1, LBound);
  SafeArrayGetUBound(fMyComObject.Scopes, 1, HBound);
  for i := lBound to Hbound do
  begin
    SafeArrayGetElement(fMyComObject.Scopes, i, Scope);
    //do something with scope
  end;
end;
0 голосов
/ 08 февраля 2010

Я не знаю точно, как Delphi обрабатывает интерпретацию библиотеки типов, но SAFEARRAY имеет связанный тип.

Если вы можете просмотреть библиотеку типов для сборки C #, вы, вероятно, сможете найти оттуда базовый тип.

Если нет, вы можете вызвать SafeArrayGetVarType для массива, чтобы получить связанный с ним тип во время выполнения (однако возникли проблемы с SAFEARRAY, созданными некоторыми API, однако вы можете получить мусор обратно).

Скорее всего, однако, он представлен как SAFEARRAY из VARIANT, где каждый элемент имеет "динамический" тип.

Знаете ли вы, если вы можете обработать VARIANT s в Delphi?

...