我正在制作使用64位c DLL的64位Delphi导出程序。我得到的问题是c DLL无法识别Delphi枚举并返回错误数据类型的错误。我已经尝试将{$ packenums}或{$ Z}指令用于Delphi编译器,但仍返回相同的错误。我正在使用xe8 Delphi。枚举看起来像:
type
DDCDataType=(
DDC_notype = 0,
DDC_UInt8 = 5, // unsigned char
DDC_Int16 = 2, // short
DDC_Int32 = 3, // int
DDC_Float = 9, // float -> single
DDC_Double = 10, // double
DDC_String = 23 // string
);
c标题中的看起来像
typedef enum {
DDC_UInt8 = 5, // unsigned char
DDC_Int16 = 2, // short
DDC_Int32 = 3, // int
DDC_Float = 9, // float
DDC_Double = 10, // double
DDC_String = 23, // string
DDC_Timestamp = 30, // timestamp (Year/Month/Day/Hour/Minute/Second/Millisecond components)
} DDCDataType;
我希望这有道理:) 谢谢!
答案 0 :(得分:1)
在C代码中,DDCDataType
只是int
。这意味着它的大小为4.在Delphi代码中,使用默认编译器设置,枚举类型的大小为1.您应该使用{$Z4}
来匹配C代码。
您可能不希望在整个项目中使用{$Z4}
,因此您应该将其放在Delphi互操作单元中。定义导入的类型和功能的单元。如果您将该互操作代码与其他应用程序逻辑混淆,请立即抓住机会保持清晰的分离。
你还没有忠实地翻译过这种类型。您添加了一个值,但错过了一个值。它应该是:
{$Z4}
type
DDCDataType=(
DDC_UInt8 = 5, // unsigned char
DDC_Int16 = 2, // short
DDC_Int32 = 3, // int
DDC_Float = 9, // float
DDC_Double = 10, // double
DDC_String = 23, // string
DDC_Timestamp = 30, // timestamp (Year/Month/Day/Hour/Minute/Second/Millisecond components)
);
通过该声明,您可以确信此类型与您的C代码完全匹配。您的计划中可能存在其他问题。如果您的其他程序失败,请不要感到惊讶。我刚刚回答了你在这里提出的问题。
要完全清楚,如果您使用上述声明,并且您的程序仍然失败,那么您应该知道其他原因。