【问题标题】:Enum problems when loading 64bit c DLLs in 64bit Delphi在 64 位 Delphi 中加载 64 位 c DLL 时的枚举问题
【发布时间】:2016-08-12 12:40:50
【问题描述】:

我正在制作使用 64 位 c DLL 的 64 位 Delphi 导出程序。我得到的问题是 c DLL 无法识别 Delphi 枚举并为错误的数据类型返回错误。我已经尝试对 Delphi 编译器使用 {$packenums} 或 {$Z} 指令,但仍然返回相同的错误。我正在使用 xe8 德尔福。枚举看起来像:

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 代码吗?否则我们将如何知道目标是什么。撇开你的问题不谈,这是一个学习我简单的 SO 互操作格言的机会:互操作问题总是需要呈现互操作边界的两侧。你只展示了一面。
  • 我已经尝试过评论和否,并且工作方式相同,所以我离开了他们。
  • 如果您提供了错误的值,它怎么可能工作。反复试验。这对你有用吗?
  • 适用于 32 位版本的程序
  • 不太可能。指定错误的值永远不会起作用。

标签: c++ c delphi dll enums


【解决方案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 代码完全匹配。您的程序中很可能还有其他问题。如果您的程序的其余部分失败,请不要感到惊讶。我刚刚回答了您在这里提出的问题。

要完全清楚,如果您使用上面的声明,并且您的程序仍然失败,那么您知道要在其他地方寻找原因。

【讨论】:

  • 我只是在回答你提出的问题。显然我无法调试不在这里的其他代码。我怎么能做到这一点。看起来我的最后一段是有先见之明的。与其希望我们可以从远处调试您的程序,为什么不自己调试呢?您可能比我们更容易。
  • @Primus:David Heffernan 的翻译是正确的。正如他所说,如果你仍然有问题,那不是因为枚举的声明。但是,如果您因 C 代码的错误转换而出现其他问题,我不会感到惊讶。看看我的文章"Pitfalls of converting" 了解更多关于转换此类头文件的信息。尤其要看看记录对齐、参数和调用约定,如果操作不当,通常会导致失败。
猜你喜欢
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2012-02-14
  • 2011-08-12
  • 2019-10-09
相关资源
最近更新 更多