我正在尝试在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
?
答案 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代码,我建议你这样做。