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

时间:2016-08-12 12:40:50

标签: c++ c delphi dll enums

我正在制作使用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;

我希望这有道理:) 谢谢!

1 个答案:

答案 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代码完全匹配。您的计划中可能存在其他问题。如果您的其他程序失败,请不要感到惊讶。我刚刚回答了你在这里提出的问题。

要完全清楚,如果您使用上述声明,并且您的程序仍然失败,那么您应该知道其他原因。