【问题标题】:Is it safe to return a struct from an stdcall dll function?从 stdcall dll 函数返回结构是否安全?
【发布时间】:2011-05-30 21:13:34
【问题描述】:

我正在设计一个至少在 mingw 和 msvc++ 之间必须是二进制兼容的 API。到目前为止,我已经限制自己使用函数来获取和返回原始数据类型或指向具有统一成员的 POD 结构的指针(即成员都是相同的类型,这应该会降低填充不兼容的风险)。

在某些时候按值返回结构会很方便,因此被调用者不需要保留临时副本。所以问题是:当被调用者是由与调用者不同的编译器编译时,按值向/从 stdcall 函数传递结构是否安全?这仍然适用于较新版本的 msvc 和 mingw 吗?我会更有信心,但我发现this topic 在这种确切情况下使用 cdecl 调用约定讨论了一个问题,这显然只在 mingw 4.6 中得到解决。

【问题讨论】:

  • 我现在实际试了一下,编译不出来。那么,在该约定中根本不可能按值传递结构吗?这将很快解决这个问题。
  • 你应该坚持传递指针,因为按值传递结构通常是一个坏主意(除非它们适合寄存器,但即便如此......)。

标签: visual-c++ dll mingw binary-compatibility


【解决方案1】:

【讨论】:

  • 似乎 mingw 确实支持 pack,因此在我的 API 标头中设置 #pragma pack(1) 可能有助于保持非统一结构兼容(统一结构很可能一开始就没有填充,因为类型的对齐通常与其大小相对应)。 +1,但不接受,因为它实际上并没有回答我的问题。
【解决方案2】:

我不知道 mingw,但如果它可以调用 Win32 API,那么它可以以与 stdcall 兼容的方式传递结构 - 因为许多 Win32 API 既是 stdcall 又是结构。

马丁

【讨论】:

  • 是否有按值传递结构的 Windows API 函数?
  • 一般不会。可能会有例外。
猜你喜欢
  • 2014-01-05
  • 2018-07-21
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
相关资源
最近更新 更多