跨越互操作边界使用枚举是否安全?

时间:2017-01-11 02:29:17

标签: delphi dll enums interop

我正在编写一组DLL,允许其他开发人员将自己的DLL编写为扩展。在Delphi代码中,我广泛使用枚举和枚举集。我通过DLL使用枚举。我知道我可以通过DLL在Delphi编译的不同项目中安全地使用枚举。但是,我不确定它在各种语言中的适应性。

在支持其他各种语言的同时通过DLL使用枚举是否安全?或者我应该将其转换为整数?

1 个答案:

答案 0 :(得分:1)

枚举需要作为整数(Word或DWORD)传递,您应该使用编译器指令{$MINENUMSIZE}(AKA {$Z})来确保它们的大小合适。除非您这样做,否则Delphi编译器将根据枚举值的数量使用不同的大小。

如果您计划在Windows操作系统上使用C / C ++代码进行互操作,请使用{$MINENUMSIZE 4}

我上面链接的文档解决了与C / C ++的互操作 - 请参阅第三段:

  

$ Z指令控制Delphi枚举类型的最小存储大小。

     

如果枚举的值不超过256,并且类型是在{$ Z1}状态(默认值)声明,则枚举类型将存储为无符号字节。如果枚举类型具有超过256个值,或者如果类型是在{$ Z2}状态中声明的,则它将存储为无符号字。最后,如果在{$ Z4}状态中声明了枚举类型,则将其存储为无符号双字。

     

{$ Z2}和{$ Z4}状态对于与C和C ++库的接口非常有用,这些库通常将枚举类型表示为单词或双字。