共用方式為


使用 .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) 的某些物件檔案。

另請參閱

匯入至應用程式