Sdílet prostřednictvím


Výběr použité metody exportu

Funkce můžete exportovat dvěma způsoby – soubor .def nebo __declspec(dllexport) klíčové slovo. Abyste se mohli rozhodnout, jaký způsob je pro knihovnu DLL lepší, zvažte tyto otázky:

  • Plánujete později exportovat další funkce?

  • Používá se vaše knihovna DLL pouze aplikacemi, které můžete znovu sestavit, nebo je používána aplikacemi, které nelze znovu sestavit – například aplikace vytvořené třetími stranami?

Výhody a nevýhody použití souborů .def

Export funkcí v souboru .def poskytuje kontrolu nad ordinaly exportu. Když do knihovny DLL přidáte exportovanou funkci, můžete jí přiřadit vyšší pořadovou hodnotu než jakákoli jiná exportovaná funkce. Když to uděláte, nemusí aplikace, které používají implicitní propojení, znovu propojit s knihovnou importu, která obsahuje novou funkci. To je velmi pohodlné, pokud navrhujete knihovnu DLL pro použití mnoha aplikacemi, protože můžete přidat nové funkce a také zajistit, aby fungovala správně s aplikacemi, které na ni již spoléhají. Knihovny MFC DLL jsou například sestaveny pomocí souborů .def.

Další výhodou použití souboru .def je, že můžete použít NONAME atribut k exportu funkce. Tím se do tabulky exportů v knihovně DLL vloží pouze pořadové číslo. U knihoven DLL, které mají velký počet exportovaných funkcí, může použití NONAME atributu zmenšit velikost souboru KNIHOVNY DLL. Informace o tom, jak napsat příkaz definice modulu, naleznete v tématu Pravidla pro příkazy Module-Definition. Informace o pořadovém exportu naleznete v tématu Export funkcí z knihovny DLL podle řadových, nikoli podle názvu.

Nevýhodou použití souboru .def je to, že pokud exportujete funkce v souboru C++, musíte buď dát zdobené názvy do souboru .def, nebo definovat exportované funkce pomocí extern "C", aby se zabránilo dekoraci názvů, kterou provádí kompilátor MSVC.

Pokud umístíte zdobené názvy do souboru .def, můžete je získat pomocí nástroje DUMPBIN nebo pomocí linkeru /MAP možnost. Zdobené názvy vytvořené kompilátorem jsou specifické pro kompilátor; Proto, pokud vložíte zdobené názvy vytvořené kompilátorem do souboru .def, aplikace, které odkazují na knihovnu DLL, musí být vytvořeny také pomocí stejné verze kompilátoru, aby zdobené názvy ve volající aplikaci odpovídaly exportovaným názvům v souboru .def knihovny DLL.

Výhody a nevýhody použití __declspec(dllexport)

Použití __declspec(dllexport) je pohodlné, protože se nemusíte starat o údržbu souboru .def a získání zdobených názvů exportovaných funkcí. Užitečnost tohoto způsobu exportu je však omezena počtem propojených aplikací, které jste ochotni znovu sestavit. Pokud knihovnu DLL znovu sestavíte s novými exporty, musíte také znovu sestavit aplikace, protože upravené názvy exportovaných funkcí jazyka C++ se můžou změnit, pokud k opětovnému sestavení použijete jinou verzi kompilátoru.

Co chcete udělat?

O čem chcete vědět víc?

Viz také

Export z knihovny DLL