在PSafeArray中发送Delphi记录

时间:2013-07-28 04:01:42

标签: delphi

我正在尝试在Delphi应用程序中使用ActiveX对象。我必须使用的方法之一要求我发送以下结构:

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

中的元素的任何想法

1 个答案:

答案 0 :(得分: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来处理此类结构的目的是定义一个对象而不是一个记录(例如,在C#中使用class而不是struct。在数组的insteas中,我们定义了一个List<>。然后在相应的..._tlb.pas中将其作为Delphi接口导入,并包含所有需要的成员。无需调整COM内部。如果你可以改变ActiveX代码,我建议你这样做。