gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:33:19 25 4
gpt4 key购买 nike

我正在制作使用 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 互操作单元中。定义导入的类型和函数的单元。如果您将该互操作代码与其他应用程序逻辑混在一起,现在就捕获机会保持清晰的分离。

不过您还没有忠实地翻译类型。您添加了一个值,但漏掉了一个值。应该是:

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

完全清楚,如果您使用上面的声明,而您的程序仍然失败,那么您就知道要到别处寻找原因。

关于c++ - 在 64 位 Delphi 中加载 64 位 com DLL 时的枚举问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38918221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com