2013-07-28 4 views
0

Я пытаюсь использовать объект ActiveX в приложении Delphi. Один из методов, которые я должен использовать требовать, чтобы я отправить следующую структуру:Отправить Delphi запись в PSafeArray

SCategoryMember = packed record 
    terminal: WideString; 
    semanticStatements: WideString; 
    symbolAttributeDefinitions: WideString; 
end; 

через этот вызов метода:

procedure SetCategoryMembers(var a_category: SGrammarSymbol; 
    a_mode: SetCategoryMode; 
    var a_members: PSafeArray); safecall; 

, где SCategoryMember структура должна быть отправлена ​​в качестве элемента в параметре a_members.

Любая идея о том, как я могу преобразовать запись пакета в элемент в PSafeArray?

+0

См. [Это сообщение] (http://stackoverflow.com/a/6347140/62576) для ссылки, которая может помочь. –

ответ

0

Я полагаю, вы ожидаете, что массив меток будет отправлен методу ActiveX.

AFAIK, Delphi не поддерживает прямое маршалинг типов записей COM (т. Е. Внутренний тип VT_RECORD). Но вы можете попробовать create a safe array pointing to the data. Но проблема в том, что ваша структура имеет WideString пользователей. Это несколько сложно, но feasible, if you take a look at this answer.

Что мы обычно делаем с COM для таких структур, это определить объект вместо записи (например, class вместо struct в C#). И установки массива, мы определяем List<>. Затем он импортируется как интерфейсы Delphi в соответствующий ..._tlb.pas со всеми необходимыми членами. Не нужно настраивать внутреннюю часть COM. Если вы можете изменить код ActiveX, я рекомендую вам пройти этот путь.

+0

Почему какое-то анонимное голосование? –

Смежные вопросы