使用 .DEF 檔匯入
如果您選擇搭配 .def 檔案使用 __declspec(dllimport)
,您應該將 .def 檔案變更為使用 DATA 來取代 CONSTANT,以減少不正確的編碼會造成問題的可能性:
// project.def
LIBRARY project
EXPORTS
ulDataInDll DATA
下表顯示原因。
關鍵字 | 在匯入程式庫中發出 | 匯出 |
---|---|---|
CONSTANT |
_imp_ulDataInDll , _ulDataInDll |
_ulDataInDll |
DATA |
_imp_ulDataInDll |
_ulDataInDll |
使用 __declspec(dllimport)
和 CONSTANT 會 imp
同時列出 .lib DLL 匯入程式庫中的版本和未編碼名稱,以允許明確連結。 使用 __declspec(dllimport)
和 DATA 只會 imp
列出名稱的版本。
如果您使用 CONSTANT,可以使用下列其中一個程式碼建構來存取 ulDataInDll
:
__declspec(dllimport) ULONG ulDataInDll; /*prototype*/
if (ulDataInDll == 0L) /*sample code fragment*/
-或-
ULONG *ulDataInDll; /*prototype*/
if (*ulDataInDll == 0L) /*sample code fragment*/
不過,如果您在 .def 檔案中使用 DATA,只有使用下列定義編譯的程式碼可以存取 變數 ulDataInDll
:
__declspec(dllimport) ULONG ulDataInDll;
if (ulDataInDll == 0L) /*sample code fragment*/
使用 CONSTANT 比較有風險,因為如果您忘記使用額外層級的間接存取,您可能會存取匯入位址表對變數的指標,而不是變數本身。 這種類型的問題通常會顯示為存取違規,因為編譯器和連結器目前已將匯入位址表設為唯讀。
如果目前的 MSVC 連結器看到 .def 檔案中的 CONSTANT 來說明此案例,就會發出警告。 使用 CONSTANT 的唯一真實原因是您無法重新編譯原型上標頭檔未列出 __declspec(dllimport)
的某些物件檔案。