INFO: Pomocí _declspec(dllimport) & _declspec(dllexport) v kódu

Překlady článku Překlady článku
ID článku: 132044 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Tento článek doplňují informace v následujícím článku znalostní báze databáze Microsoft Knowledge Base:
107501 INFO: __export, nahrazuje __declspec v jazyce C++ 32-bit
Tento článek popisuje výhody a mechanismus použití _declspec(DllImport) a _declspec(dllexport) v aplikaci.

Další informace

32Bitová aplikace Visual C++, používá _declspec(dllimport) a _declspec(dllexport) nahradit dříve používané klíčové slovo __export 16bitové verze aplikace Visual C++.

Není nutné kompilovat pomocí _declspec(dllimport) kódu správně ale tím tak umožňuje generování lepšího kódu kompilátoru. Na Kompilátor je schopen generování lepšího kódu, protože ví, pro jistotu zda funkce existuje v knihovně DLL nebo Ne, tak může způsobit kompilátor kódů přeskočte úroveň nepřímé odkazování, které by normálně byly přítomny funkce volání, které překračování hranice knihovny DLL.

Správné.VÝVOZY části DEF soubor _declspec(dllexport) není povinné. _declspec(dllexport) byla přidána poskytují snadný export funkce z.EXE nebo.Knihovna DLL bez použití.DEF soubor.

Zbývající část tohoto článku poskytuje poměrně nízkoúrovňové, důkladné rozbor těchto problémů.

Formát Portable spustitelný soubor Win32 je navržen k minimalizaci počtu stránky, které musí být dotyku opravit dovozů. Chcete-li to provést, umístí všechny Importujte adres pro libovolnou aplikaci na jednom místě, které se nazývá importovat adresy Tabulka. To umožňuje loader upravovat pouze jeden nebo dva stránky při přístup k těmto dovozům.

Pomocí volání funkce _declspec(dllimport)

V následujícím příkladu kódu, předpokládá func1 je funkce, která se nachází v Knihovny DLL, které jsou oddělené od.Soubor EXE, který obsahuje funkci main().

Bez _declspec(dllimport) uveden tento kód:
void main(void) {
    func1();
}
				
kompilátor vygeneruje kód, který vypadá takto:
call func1
				
a vytvořeném propojovacím převede volání do něco jako:
call 0x4000000         ; The address of 'func1'.
				
'Func1' existuje-li v jiné knihovně DLL, vytvořeném propojovacím nelze vyřešit přímo protože je žádným způsobem zjistit, co je na adresu "func1". 16-Bit v prostředí vytvořeném propojovacím přidá tento kód adresy do seznamu v.EXE že by loader oprava při spuštění se správnou adresou. 32-Bit v prostředí vytvořeném propojovacím generuje jádro, pro který ví, adresa. Jádro vypadá takto:
   0x40000000:    jmp DWORD PTR __imp_func1
				
Zde __imp_func1 je adresa func1 na patici importovat adresy Tabulka.Soubor EXE. Všechny adresy jsou tedy známo, vytvořeném propojovacím. Na zavaděč má pouze aktualizovat.Soubor EXE importovat adresy tabulku při zatížení pro všechno správně pracovat.

Proto pomocí _declspec(dllimport) je lepší, protože je lepší Pokud Propojovač negeneruje jádro, pokud nemá k. Ujistěte se, thunks kód větší (v systémech RISC, může být několik pokynů) a ke zhoršení výkonu mezipaměti. Pokud sdělujete kompilátoru, aby je funkce v Knihovna DLL, jej můžete generovat nepřímé voláním.

Nyní tento kód:
__declspec(dllimport) void func1(void);

void main(void) {
    func1();
}
				
vygeneruje tento pokyn:
call DWORD PTR __imp_func1
				
Neexistuje žádné jádro a žádné instrukce jmp, takže kód je menší a rychleji.

Na druhé straně pro volání funkce uvnitř knihovny DLL, nechcete mít nepřímé volání použít. Znáte adresu funkce. Čas a načíst a uložit adresu funkce před jsou volné místo nepřímé volání, takže přímé volání je vždy rychlejší a menší. Chcete pouze použití __declspec(dllimport) při volání funkce DLL zvenku Knihovna DLL sám. Nepoužívejte __declspec(dllimport) na funkce uvnitř knihovny DLL Při vytváření dané knihovny DLL.

Pomocí _declspec(dllexport)

__Export Microsoft zavedla v kompilátoru 16bitové verze povolit kompilátor automaticky generovat názvy exportu a umístit je .Souboru LIB. To.Souboru LIB pak můžete použít stejně jako statické.LIB k propojit s knihovnu DLL.

Společnost Microsoft přidala __declspec(dllexport) pokračovat v tomto pohodlí. Jeho účelem je vývozní směrnice přidat do souboru objektu, takže není třeba aplikace.DEF soubor.

Toto pohodlí nejzřejmější při pokusu o export zdobená C++ názvy funkcí. Neexistuje žádná standardní specifikaci pro název dekorace, tak mezi verzemi kompilátor může změnit název exportované funkce. Pokud pomocí _declspec(dllexport), kompilací knihovnu DLL a závislé.Soubory s p?íponou EXE je nezbytné pouze účet pro pojmenování změny úmluvy.

Mnoho jako řadové číslovky, PROFIL\0 nebo soukromé, lze provést export směrnic pouze v.Soubor DEF, a neexistuje žádný způsob, jak určit tyto atributy aniž.DEF soubor. Ale při použití _declspec(dllexport), kromě pomocí.Soubor DEF nezpůsobuje chyby sestavení.

Jako odkaz prohledejte Win32 WINBASE.H hlavičky souboru. Obsahuje Příklady upřednostňovaný __declspec(dllexport) a __declspec(dllimport) využití.

Pomocí _declspec(dllexport) a _declspec(dllimport) na Data

V případě dat, pomocí _declspec(dllimport) je potřebu položky Odstraní vrstva nepřímé odkazování. Při importu dat z knihovny DLL, stále musí projít importovat tabulku adres. Ve dnech Win32 _declspec(DllImport), to znamenalo že bylo nutné pamatovat na to vyšší úroveň o nepřímé odkazování při přístupu k datům vyvážené z knihovny DLL:
// project.h
#ifdef _DLL     // If accessing the data from inside the DLL
   ULONG ulDataInDll;

else            // If accessing the data from outside the DLL
   ULONG *ulDataInDll;
#endif
				
By pak exportovat data do aplikace.Soubor DEF:
// project.def
LIBRARY project
EXPORTS
    ulDataInDll   CONSTANT
				
a k němu přístup mimo knihovnu DLL:
if (*ulDataInDll == 0L) {
   // Do stuff here
}
				
Pokud označíte data jako __declspec(dllimport), kompilátor automaticky automaticky generuje kód nepřímé odkazování. Již nemusíte obávat výše uvedené kroky. Jak bylo uvedeno dříve, nepoužívejte _declspec(dllimport) prohlášení o data při vytváření knihovny DLL. Funkce v rámci knihovny DLL Importovat tabulku adresa nebude používat pro přístup k objektu data. Proto nebude mít další úroveň současné nepřímé odkazování.

Chcete-li automaticky exportovat data z knihovny DLL, použijte toto prohlášení:
__declspec(dllexport) ULONG ulDataInDLL;
				

Pomocí.Soubor DEF

Pokud použijete __declspec(dllimport) spolu s.DEF soubor, který by se měl změnit.DEF souboru použít DATA namísto KONSTANTY omezit pravděpodobnost, že správné kódování způsobí potíže:
// project.def
LIBRARY project
EXPORTS
    ulDataInDll   DATA
				
Následující graf ukazuje proč:
Keyword     Emits in the import lib     Exports
CONSTANT    __imp_ulDataInDll           ulDataInDll
            __ulDataInDll

DATA        __imp_ulDataInDll           ulDataInDll
				
Pomocí _declspec (dllimport) a KONSTANTY jsou uvedeny verze __imp_ a Zdrojový název v.Importovat knihovny LIB DLL, vytvořené za účelem Povolte explicitní propojení. Pomocí _declspec(dllimport) a DATA jsou uvedeny pouze na Název verze __imp_.

Pokud použijete KONSTANTU, lze použít buď následující konstrukce kódu přístup ulDataInDll:
__declspec(dllimport) ULONG ulDataInDll; /*prototype*/ 
   if (ulDataInDll == 0L)   /*sample code fragment*/ 
				
- nebo -
ULONG *ulDataInDll;      /*prototype*/ 
if (*ulDataInDll == 0L)  /*sample code fragment*/ 
				
Však používáte DATA ve vašem.DEF, pouze kód spis s Následující definice přístup proměnné ulDataInDll:
__declspec(dllimport) ULONG ulDataInDll;
if (ulDataInDll == 0L)   /*sample code fragment*/ 
				
Použití KONSTANT je více riskantní, protože pokud zapomenete použít vyšší úroveň o nepřímé odkazování by mohly potenciálně přístup importovat tabulku adresa ukazatel proměnné--není proměnné. Tento typ problému můžete často projeví jako narušení přístupu, protože importovat tabulku adresa je nyní jen pro čtení kompilátor Microsoft a linkers.

Aktuální Visual C++ linker vydá varování, pokud zjistí KONSTANTA v na.Soubor DEF účet pro tento případ. Pouze skutečný důvod pro použití KONSTANTA je, pokud nelze překompilovat některé objektu souboru kde záhlaví souboru neobsahoval dllimport na prototyp.

Odkazy

Visual C++ Books Online poskytují značné množství dokumentace Atributy úložiště tříd dllexport a dllimport. To zahrnuje "Atributy dllexport a dllimport" a "pomocí dllimport a dllexport v jazyce C++ "témata v kapitole"Modifikátory společnosti Microsoft" C++ jazyková Reference a témata "Export symboly" "Vytvoření knihovny DLL pro Win32" kapitola referenční techniky programování. Úplný seznam hledání knih Online pro Příbuzná témata "dllimport" nebo "dllexport".

Další informace naleznete v následujících článcích Microsoft Znalostní báze Knowledge Base:
90530 Jak exportovat Data z knihovny DLL nebo aplikace
107501 INFO: __export, nahrazuje __declspec v jazyce C++ 32-bit

Vlastnosti

ID článku: 132044 - Poslední aktualizace: 23. dubna 2011 - Revize: 4.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
Klíčová slova: 
kbcode kbcompiler kbinfo kbmt KB132044 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:132044
Právní omezení pro obsah znalostní báze týkající se produktů, jejichž podpora byla ukončena
Tento článek byl napsán o produktech, pro které společnost Microsoft již neposkytuje nadále podporu. Článek je tedy nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com