2011-05-30 56 views
3

我正在設計一個至少在mingw和msvC++之間必須是二進制兼容的API。到目前爲止,我只限於使用函數來獲取和返回原始數據類型或指向具有統一成員的POD結構的指針(即成員都是相同類型,這會降低不兼容填充的風險)。從stdcall dll函數返回結構是否安全?

雖然在某些時候按值返回結構會很方便,因此被調用者不需要保留臨時副本。所以問題是:當被調用者是由不同的編譯器編譯而不是調用者時,是否可以通過值將結構傳遞給/從stdcall函數安全?這仍然適用於最新版本的msvc和mingw嗎?我會更有信心,但我發現this topic用cdecl調用約定討論了這種情況下的一個問題,顯然這隻能在4.6版本中解決。

+0

我其實已經試過了,它不會編譯。那麼,在該公約中,通過價值傳遞結構是不可能的呢?這很快就會解決這個問題。 – Medo42 2011-05-30 21:20:27

+0

你應該堅持傳遞指針,因爲通過價值傳遞結構通常是一個壞主意(除非它們適合寄存器,但即使如此...)。 – Necrolis 2011-05-31 14:03:28

回答

0

我不知道mingw,但是如果它可以調用Win32 API,那麼它可以通過與stdcall兼容的方式傳遞結構 - 因爲許多Win32 API都是stdcall和take structs。

Martyn

+0

是否有通過值傳遞結構的Windows API函數? – Medo42 2011-05-31 20:47:57

+0

一般不會。可能有例外。 – 2011-06-01 03:57:40

2
+0

似乎mingw不支持pack,所以在我的API頭文件中設置#pragma pack(1)可能有助於保持非統一結構的兼容性(統一結構很可能不會被填充,因爲類型的對齊通常與它的大小)。 +1,但不接受,因爲它實際上不能回答我的問題。 – Medo42 2011-05-31 20:45:19