[英]Enum problems when loading 64bit c DLLs in 64bit Delphi
我正在制作使用64位c DLL的64位Delphi导出程序。 我得到的问题是c DLL无法识别Delphi枚举,并为错误的数据类型返回错误。 我尝试对Delphi编译器使用{$ packenums}或{$ Z}指令,但仍然返回相同的错误。 我正在使用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;
我希望这是有道理的:)谢谢!
在C代码中, DDCDataType
只是一个int
。 这意味着它的大小为4。在您的Delphi代码中,使用默认的编译器设置,枚举类型的大小为1。您应该使用{$Z4}
来匹配C代码。
您可能不想在整个项目中使用{$Z4}
,因此应将其放在Delphi interop单元中。 定义导入的类型和功能的单位。 如果您已将该互操作代码与其他应用程序逻辑混合在一起,请立即抓住机会保持清晰的分隔。
您尚未忠实地翻译类型。 您添加了一个值,却错过了一个值。 它应该是:
{$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代码完全匹配。 您的程序中可能还存在其他问题。 如果程序的其余部分失败,请不要感到惊讶。 我刚刚回答了您在这里提出的问题。
要完全清楚,如果您使用上面的声明,而您的程序仍然失败,那么您知道在其他地方查找原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.