Sdílet prostřednictvím


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.

Viz také

Koncepty

Import do aplikace