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 ulDataInDll
použí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é ulDataInDll
pří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.