Rozhodnutí, kterou exportovací metodu použít
Chcete-li určit, kterou metodu použít pro exportování funkcí (soubor .def nebo klíčové slovo __declspec(dllexport)), odpovězte na následující otázky:
Budete pokračovat v přidávání dalších exportovaných funkcí?
Kdo používá vaši knihovnu DLL? Například, je to knihovna DLL třetí strany používaná mnoha spustitelnými soubory, které nelze znovu sestavit, nebo je knihovna DLL používaná pouze aplikacemi, které můžete snadno znovu sestavit?
Výhody a nevýhody použití souborů .DEF
Exportování funkcí v souboru .def vám dává kontrolu nad pořadím exportu. Přidáte-li další exportované funkce do vaší knihovny DLL, můžete jim přiřadit vyšší hodnoty pořadového čísla (vyšší než u jakýchkoli jiných exportovaných funkcí). Když toto provedete, aplikace používající implicitní propojení se nemusí znovu propojit s novou knihovnou importu, která obsahuje nové funkce. To je velmi důležité například pokud navrhujete knihovnu DLL třetí strany pro použití mnoha aplikacemi. Můžete pokračovat ve vylepšování vaší knihovny DLL přidáváním dalších funkcí při současném zajištění, že budou existující aplikace správně pokračovat v práci s novou knihovnou DLL. Knihovny MFC DLL jsou sestaveny pomocí souborů .def.
Další výhodou použití souboru .def je, že můžete exportovat funkce pomocí atributu NONAME, který umístí do exportovací tabulky v knihovně DLL pouze pořadí. Pro knihovny DLL s velkým počtem exportovaných funkcí může použití atributu NONAME zmenšit velikost souboru knihovny DLL. Pro informace o psaní příkazů definice modulu si prohlédněte Pravidla pro příkazy definice modulu. Pro další informace o exportu podle pořadí si prohlédněte Exportování funkcí z knihovny DLL podle pořadí, nikoli podle názvu.
Hlavní nevýhodou použití souboru .def je, že pokud exportujete funkce v souboru C++, musíte buď umístit do souboru .def dekorované názvy nebo definovat vaše exportované funkce se standardním navázáním C pomocí extern "C" pro zamezení dekorování názvů kompilátorem.
Pokud potřebujete umístit do souboru .def dekorované názvy, můžete je získat pomocí nástroje DUMPBIN nebo pomocí volby propojovacího programu /MAP. Všimněte si, že dekorované názvy produkované kompilátorem, jsou specifické pro kompilátor. Pokud umístíte dekorované názvy produkované kompilátorem jazyka Visual C++ do .def souboru, pak musí být aplikace které jsou propojeny s Vaší DLL knihovnou sestaveny stejnou verzí jazyka Visual C++ tak, aby dekorované názvy ve volání aplikace odpovídaly exportovaným názvům v .def souboru knihovny DLL.
Výhody a nevýhody použití __declspec(dllexport)
Použití __declspec(dllexport) je vhodné, protože není třeba udržovat soubor .def a získávat dekorované názvy exportovaných funkcí. Tato metoda je vhodná, pokud například navrhujete knihovnu DLL pro použití s aplikací, kterou ovládáte. Pokud znovu sestavíte knihovnu DLL s novými exporty, musíte také znovu sestavit aplikaci, protože dekorované názvy pro exportované funkce C++ se mohly změnit, pokud jste znovu kompilovali jinou verzí kompilátoru.
Co chcete udělat?
Export funkcí jazyka C++ pro použití ve spustitelných souborech jazyka C
Export funkcí jazyka C pro použití ve spustitelných souborech jazyka C nebo jazyka C++