繁体   English   中英

在64位Delphi中加载64位c DLL时出现枚举问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM