Sdílet prostřednictvím


Import pomocí souborů DEF

Pokud se rozhodnete použít __declspec(dllimport) společně se souborem .def, měli byste změnit soubor .def tak, aby místo KONSTANTy používal data, aby se snížila pravděpodobnost, že nesprávné kódování způsobí problém:

// project.def
LIBRARY project
EXPORTS
   ulDataInDll   DATA

Následující tabulka uvádí, proč.

Klíčové slovo Generuje v knihovně importu. Exporty
CONSTANT _imp_ulDataInDll, _ulDataInDll _ulDataInDll
DATA _imp_ulDataInDll _ulDataInDll

Použití __declspec(dllimport) a konstanta uvádí verzi imp i nezakódovaný název v knihovně importu knihovny DLL knihovny .lib, která je vytvořená tak, aby umožňovala explicitní propojení. Použití __declspec(dllimport) a data uvádí jenom imp verzi názvu.

Pokud používáte konstantu CONSTANT, lze pro přístup ulDataInDllpoužít některý z následujících konstruktorů kódu:

__declspec(dllimport) ULONG ulDataInDll; /*prototype*/
if (ulDataInDll == 0L)   /*sample code fragment*/

nebo

ULONG *ulDataInDll;      /*prototype*/
if (*ulDataInDll == 0L)  /*sample code fragment*/

Pokud však v souboru .def použijete DATA, bude mít k proměnné ulDataInDllpřístup pouze kód zkompilovaný s následující definicí:

__declspec(dllimport) ULONG ulDataInDll;

if (ulDataInDll == 0L)   /*sample code fragment*/

Použití konstanty CONSTANT je risknější, protože pokud zapomenete použít další úroveň nepřímých výrazů, můžete potenciálně přistupovat k ukazateli tabulky importu adres na proměnnou – ne na samotnou proměnnou. Tento typ problému se často může projevit jako porušení přístupu, protože tabulka adresy importu je aktuálně určena jen pro čtení kompilátorem a linkerem.

Aktuální linker MSVC vydá upozornění, pokud se v souboru .def zobrazí konstanta pro tento případ. Jediným skutečným důvodem použití KONSTANTY je, že nemůžete znovu zkompilovat nějaký soubor objektu, kde soubor záhlaví nebyl vypisovaný __declspec(dllimport) v prototypu.

Viz také

Import do aplikace