Import pomocí DEF souborů
Pokud se rozhodnete použít __declspec(dllimport) spolu s .def souborem, měli byste změnit tento .def soubor tak, že místo CONSTANT použijete DATA ke snížení pravděpodobnosti, že nesprávné kódování způsobí problém:
// project.def
LIBRARY project
EXPORTS
ulDataInDll DATA
Následující tabulka ukazuje proč.
Klíčové slovo |
Vychází v importní knihovně |
Exporty |
---|---|---|
CONSTANT |
_imp_ulDataInDll_ulDataInDll |
_ulDataInDll |
DATA |
_imp_ulDataInDll |
_ulDataInDll |
Použitím __declspec(dllimport) a CONSTANT sepisuje obě verze imp a nedekorované jméno v souboru .lib importní knihovny DLL, která je vytvořena za účelem povolení explicitního propojení. Použitím __declspec(dllimport) a DATA sepisuje pouze verzi imp názvu.
Použijete-li CONSTANT, může být použita pouze následující konstrukce kódu k přístupu ulDataInDll:
__declspec(dllimport) ULONG ulDataInDll; /*prototype*/
if (ulDataInDll == 0L) /*sample code fragment*/
-nebo-
ULONG *ulDataInDll; /*prototype*/
if (*ulDataInDll == 0L) /*sample code fragment*/
Nicméně, pokud používáte DATA ve Vašem .def souboru, pak pouze zkompilování kódu s následující definicí může přistoupit proměnnou ulDataInDll:
__declspec(dllimport) ULONG ulDataInDll;
if (ulDataInDll == 0L) /*sample code fragment*/
Použití CONSTANT je více riskantní, protože pokud zapomenete použít vyšší úroveň dereference, můžete potenciálně přistoupit importní adresu ukazatele tabulky na proměnnou - ne samostatnou proměnnou.Tento typ problému se může často projevovat jako narušení přístupu, protože importní tabulka adres je aktuálně vytvořena kompilátorem a propojovacím programem pouze pro čtení.
Aktuální propojovací program jazyka Visual C++ vydá upozornění, pokud nalezne CONSTANT v .def souboru pro počínání si s tímto případem.Jediný skutečný důvod pro použití CONSTANT je pokud nemůžete překompilovat některý objekt souboru, kde hlavičkový soubor nesepisuje __declspec(DllImport) na prototyp.