Návod: Vytvoření a použití dynamické knihovny (C++)
Tento podrobný průvodce ukazuje, jak vytvořit dynamické knihovna (DLL) pro použití s aplikací C++.Použití knihovny je skvělým způsobem, jak znovu použít kód.Namísto opětovné implementace stejných rutin v každý program, který vytvoříte, je napsat jednou a potom je odkazovat z aplikací, které vyžadují funkci.Vložením kódu v knihovně DLL ušetřit místo v každé aplikace, který odkazuje na jeho a bez nutnosti opětovné kompilace všech aplikací, které lze aktualizovat knihovny DLL.Další informace o knihovny DLL, naleznete v části Knihovny DLL v jazyce Visual C++.
V tomto návodu se vztahuje na tyto úlohy:
Vytváření projektu knihovny DLL.
Přidání třídy do knihovny DLL.
Vytvoření aplikace konzoly, který používá čas načítání dynamické propojení k odkazování knihovny DLL.
Využití funkcí ze třídy v aplikaci.
Spuštění aplikace.
Tento průvodce vytvoří knihovnu DLL, kterou lze volat pouze z aplikací, které používají volání konvencí C++.Informace o tom, jak vytvořit knihovny DLL pro použití s jinými jazyky naleznete v tématu Volání funkcí knihovny DLL z aplikací jazyka Visual Basic.
Požadavky
Toto téma předpokládá, že jste pochopili základy jazyka C++.
Vytvořit projekt dynamická knihovna (DLL)
Na řádku nabídek klikněte na položky Soubor, Nový, Projekt.
V levém podokně nový projekt dialogové okno rozbalte nainstalované, šablony, **Visual C++**a potom vyberte Win32.
V prostředním podokně vyberte aplikace konzoly Win32.
Zadejte název pro projekt – například MathFuncsDll – v název pole.Zadejte název pro řešení – například DynamicLibrary – v název řešení pole.Zvolte OK tlačítko.
Na přehled stránku Průvodce aplikací Win32 dialogové okno zvolte Další tlačítko.
Na nastavení aplikace stránky v části typ aplikace, vyberte možnost DLL.
Stisknutím tlačítka Dokončit vytvořte projekt.
Chcete-li přidat třídu do knihovny DLL
Chcete-li vytvořit soubor hlaviček pro novou třídu, v nabídce, zvolte projektu, přidat novou položku.V přidat novou položku dialogové okno, v levém podokně pod položkou Visual C++, vyberte možnost kódu.V prostředním podokně vyberte soubor (hlaviček).Zadejte název souboru hlaviček – například, pak zvolte MathFuncsDll.h—and přidat tlačítko.Zobrazí se prázdné záhlaví souboru.
Přidáte následující kód do začátku hlavičky souboru:
// MathFuncsDll.h #ifdef MATHFUNCSDLL_EXPORTS #define MATHFUNCSDLL_API __declspec(dllexport) #else #define MATHFUNCSDLL_API __declspec(dllimport) #endif
Přidáte základní třídu pojmenovanou MyMathFuncs k provádění běžných matematických operací, například sčítání, odčítání, násobení a dělení.Kód by měl vypadat takto:
namespace MathFuncs { // This class is exported from the MathFuncsDll.dll class MyMathFuncs { public: // Returns a + b static MATHFUNCSDLL_API double Add(double a, double b); // Returns a - b static MATHFUNCSDLL_API double Subtract(double a, double b); // Returns a * b static MATHFUNCSDLL_API double Multiply(double a, double b); // Returns a / b // Throws const std::invalid_argument& if b is 0 static MATHFUNCSDLL_API double Divide(double a, double b); }; }
Pokud je symbol MATHFUNCSDLL_EXPORTS je definován, bude sada symbolů MATHFUNCSDLL_API __declspec(dllexport) modifikátor v deklaracích funkce člena v tomto kódu.Tento modifikátor umožňuje funkce, které budou exportovány knihovny DLL tak, aby mohou být využívána jinými aplikacemi.Pokud není definováno MATHFUNCSDLL_EXPORTS – například, když je soubor hlaviček zahrnuty ve aplikace – definuje MATHFUNCSDLL_API __declspec(dllimport) modifikátor v prohlášeních o funkce člena.Tento modifikátor optimalizuje import funkce v aplikaci.Ve výchozím nastavení, přidá nový projekt šablony pro knihovnu DLL PROJECTNAME_EXPORTS na definované symboly pro projekt knihovny DLL.V tomto příkladu je definován MATHFUNCSDLL_EXPORTS při sestavení projektu MathFuncsDll.Další informace naleznete v tématu dllexport, dllimport.
[!POZNÁMKA]
Pokud sestavujete projekt knihovny DLL na příkazovém řádku, použijte /D možnosti kompilátoru definujte MATHFUNCSDLL_EXPORTS symbol.
V MathFuncsDll projekt v Průzkumníka řešenív zdrojové soubory složky, otevřete MathFuncsDll.cpp.
Implementujte funkcionalitu MyMathFuncs ve zdrojovém souboru.Kód by měl vypadat takto:
// MathFuncsDll.cpp : Defines the exported functions for the DLL application. // #include "stdafx.h" #include "MathFuncsDll.h" #include <stdexcept> using namespace std; namespace MathFuncs { double MyMathFuncs::Add(double a, double b) { return a + b; } double MyMathFuncs::Subtract(double a, double b) { return a - b; } double MyMathFuncs::Multiply(double a, double b) { return a * b; } double MyMathFuncs::Divide(double a, double b) { if (b == 0) { throw invalid_argument("b cannot be zero!"); } return a / b; } }
Kompilaci knihovnu DLL volbou sestavení, sestavit řešení v nabídce.
[!POZNÁMKA]
Pokud používáte Express edition, který nemá zobrazovat sestavení nabídky v nabídce, zvolte nástroje, nastavení, Expert nastavení ji povolit, a poté zvolte příkaz sestavení, sestavit řešení.
[!POZNÁMKA]
Pokud sestavujete projekt na příkazovém řádku, použijte /LD možnosti kompilátoru k určení, že má být knihovna DLL výstupní soubor.Další informace naleznete v tématu /MD, /MT, /LD (Použít běhovou knihovnu).Použití /EHsc možnosti kompilátoru pro povolení zpracování výjimek C++.Další informace naleznete v tématu /EH (model zpracování výjimek).
Chcete-li vytvořit aplikace, která odkazuje na knihovnu DLL
Chcete-li vytvořit aplikaci C++, která bude odkazovat a využívat knihovnu DLL, který jste vytvořili, v nabídce, zvolte soubor, nový, projektu.
V levém podokně pod Visual C++, vyberte možnost Win32.
V prostředním podokně vyberte aplikace konzoly Win32.
Zadejte název pro projekt – například MyExecRefsDll – v název pole.Vedle řešení, vyberte možnost přidat řešení z rozevíracího seznamu.Přidá nový projekt do stejného řešení, která obsahuje knihovnu DLL.Zvolte OK tlačítko.
Na přehled stránku Průvodce aplikací Win32 dialogové okno zvolte Další tlačítko.
Na nastavení aplikace stránky v části typ aplikace, vyberte možnost konzoly aplikace.
Na nastavení aplikace stránky v části další možnosti, zrušte předkompilované hlavičky zaškrtávací políčko.
Stisknutím tlačítka Dokončit vytvořte projekt.
Chcete-li použít funkci z knihovny tříd v aplikaci
Po vytvoření aplikace konzoly je vytvořen prázdný program.Název zdrojového souboru je stejný jako název, který jste zvolili dříve.V tomto příkladu je název MyExecRefsDll.cpp.
Pokud chcete používat v aplikaci matematických rutin, které jste vytvořili v knihovně DLL, musí být uvedena.Chcete-li to provést, vyberte možnost projekt MyExecRefsDll v Průzkumníka řešenía v nabídce, zvolte možnost projektu, odkazuje na.V stránky vlastností dialogové okno rozbalte běžné vlastnosti uzel, vyberte možnost architektura a odkazy naa poté zvolte možnost přidat nový odkaz tlačítko.Další informace o odkazuje na dialogového okna, naleznete v části Architektura a odkazy, Společná nastavení, Dialogové okno Stránky vlastností projektu <Projectname>.
Přidat odkaz dialogové okno obsahuje seznam knihoven, které lze odkazovat.Projektu karta seznam projektů v aktuálním řešení a všechny knihovny, které tyto soubory obsahují.Na projekty kartu, zaškrtněte políčko vedle MathFuncsDll a pak zvolte OK tlačítko.
Chcete-li odkazovat na soubory hlaviček knihovny DLL, je třeba upravit cesty součástí adresáře.Chcete-li to provést, v stránky vlastností dialogové okno pole, rozbalte položku vlastnosti konfigurace uzel, rozbalte položku C/C++ uzel a potom vyberte Obecné.Vedle další adresáře zahrnout, zadejte cestu k umístění hlavičky MathFuncsDll.h.Můžete použít relativní cestu – například...Zvolte \MathFuncsDll\—Then OK tlačítko.
Třídu MyMathFuncs lze nyní použít v této aplikaci.Nahraďte obsah MyExecRefsDll.cpp následující kód:
// MyExecRefsDll.cpp // compile with: /EHsc /link MathFuncsDll.lib #include <iostream> #include "MathFuncsDll.h" using namespace std; int main() { double a = 7.4; int b = 99; cout << "a + b = " << MathFuncs::MyMathFuncs::Add(a, b) << endl; cout << "a - b = " << MathFuncs::MyMathFuncs::Subtract(a, b) << endl; cout << "a * b = " << MathFuncs::MyMathFuncs::Multiply(a, b) << endl; cout << "a / b = " << MathFuncs::MyMathFuncs::Divide(a, b) << endl; try { cout << "a / 0 = " << MathFuncs::MyMathFuncs::Divide(a, 0) << endl; } catch (const invalid_argument &e) { cout << "Caught exception: " << e.what() << endl; } return 0; }
Sestavte spustitelný soubor volbou sestavení, sestavit řešení v nabídce.
Ke spuštění aplikace
Ujistěte se, že MyExecRefsDll je zvolen jako výchozí projekt.V Průzkumníka řešení, zvolte MyExecRefsDll a v nabídce, zvolte možnost projektu, nastavit jako projekt při spuštění.
Kliknutím na položku Spustit bez ladění v nabídce Ladění spusťte projekt.Výstup by měl vypadat takto:
+ b = 106.4 -b =-91.6
- b = 732.6 / b = 0.0747475 Zachycena výjimka: b nemůže být nula!
Viz také
Úkoly
Návod: Nasazení programu (C++)
Koncepty
Knihovny DLL v jazyce Visual C++
Volání funkcí knihovny DLL z aplikací jazyka Visual Basic