Názorný postup: Vytváření a používání knihovny (C++)
Tento podrobný návod ukazuje, jak vytvořit dynamické knihovny (DLL) pro použití s aplikací C++.Použití knihovny je skvělým způsobem pro opětovné použití kódu.Pokud existují rutiny, které používáte ve více programech, stačí je napsat jednou a odkázat na ně z aplikace, která využívá jejich funkcionalitu.Vložením kódu do DLL knihovny lze ušetřit místo v každé aplikaci, která na ní odkazuje. Navíc lze DLL knihovny aktualizovat bez nutnosti znovu kompilovat všechny aplikace.Další informace o knihovnách DLL naleznete v tématu Knihovny DLL jazyka Visual C++.
Tento návod pokrývá následující úkoly:
Vytvoření projektu knihovny DLL.
Přidání třídy do knihovny DLL.
Vytvoření konzolové aplikace, která používá dynamické propojování k odkazování na knihovnu DLL.
Použití funkce z třídy aplikace.
Spuštění aplikace.
Tento návod vytvoří knihovnu DLL, která může být volána pouze z aplikace, které používají konvence volání jazyka C++.Informace o postupu při vytváření knihovny DLL pro použití s jinými jazyky naleznete v tématu Volání funkcí knihovny DLL z aplikací Visual Basic.
Požadavky
Toto téma předpokládá, že chápete základy jazyka C++.
Vytvoření nového projektu dynamické knihovny DLL
V panelu nabídek zvolte Soubor, Nový, Projekt.
V levém podokně dialogového okna Nový projekt rozbalte postupně položky Nainstalováno, Šablony, Visual C++ a nakonec vyberte Win32.
V prostředním podokně vyberte Konzolová aplikace Win32.
Do textového pole Název zadejte název projektu, například MathFuncsDll.Do textového pole Název řešení zadejte název řešení, například DynamicLibrary.Klikněte na tlačítko OK.
Na stránce Přehled v dialogovém okně Průvodci aplikace Win32 klikněte na tlačítko Další.
Na stránce Nastavení aplikace z Typ aplikace vyberte položku DLL.
Klikněte pro vytvoření projektu na položku Dokončit.
Přidání třídy do knihovny DLL
Soubor hlaviček pro novou třídu lze vytvořit kliknutím na položku Projekt a následně na položku Přidat novou položku.V dialogovém okně Přidat novou položky klikněte v levém podokně pod Visual C++ na položku Kód.V prostředním podokně vyberte Soubor hlaviček (.h).Zadejte název souboru hlaviček, například MathFuncsDll.h, a následně klikněte na tlačítko Přidat.Zobrazí se prázdný soubor hlaviček.
Na začátek souboru hlaviček přidejte následující kód:
// MathFuncsDll.h #ifdef MATHFUNCSDLL_EXPORTS #define MATHFUNCSDLL_API __declspec(dllexport) #else #define MATHFUNCSDLL_API __declspec(dllimport) #endif
Přidejte jednoduchou třídu pojmenovanou MyMathFuncs, která provádí běžné matematické operace, jako 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 definován symbol MATHFUNCSDLL_EXPORTS, nastaví symbol MATHFUNCSDLL_API v deklaraci členské funkce v tomto kódu modifikátor __declspec(dllexport).Tento modifikátor umožňuje funkci, aby byla exportovaná knihovnou DLL, aby jí bylo možno použít v jiných aplikacích.Pokud není symbol MATHFUNCSDLL_EXPORTS definován, definuje MATHFUNCSDLL_API v deklaraci členské funkce modifikátor __declspec(dllimport).Tento modifikátor umožňuje kompilátoru optimalizovat import funkce z knihovny DLL pro použití v jiných aplikacích.Symbol MATHFUNCSDLL_EXPORTS je ve výchozím nastavení definován při sestavení projektu MathFuncsDll.Další informace naleznete v tématu dllexport dllimport..
[!POZNÁMKA]
Pokud je projekt knihovny DLL sestavován pomocí příkazového řádku, použijte možnost kompilátoru /D pro definování symbolu MATHFUNCSDLL_EXPORTS.
V projektu MathFuncsDll v Průzkumníku řešení ve složce Zdrojové soubory 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; } }
Zkompilujte knihovnu DLL kliknutím na položku Sestavení na panelu nabídek a následně na položku Sestavit řešení.
[!POZNÁMKA]
Pokud používáte edici Express, kde není v panelu nabídek Sestavení zobrazeno, klikněte pro jeho zobrazení postupně na položky Nástroje, Nastavení a Expertní nastavení, poté klikněte na položku Sestavení a nakonec na položku Sestavit řešení.
[!POZNÁMKA]
Pokud je projekt sestavován z příkazové řádky, je potřeba pro určení, že výstupní soubor má být knihovna DLL, použít možnost kompilátoru /LD.Další informace naleznete v tématu / /LD MD, /MT, (použití knihovna Run-Time).Pro povolení zpracování výjimek v jazyce C++ je potřeba použít možnost kompilátoru /EHsc.Další informace naleznete v tématu /EH (Model zpracování výjimek).
Vytvoření aplikace, která odkazuje na knihovnu DLL
Pro vytvoření aplikace C++, která bude referencovat a používat právě vytvořenou DLL knihovnu, na panelu nabídek klikněte na položku Soubor a poté postupně na položky Nový a Projekt.
V levém podokně v části Visual C++ klikněte na Win32.
V prostředním podokně vyberte Konzolová aplikace Win32.
Do textového pole Název zadejte název projektu, například MyExecRefsDll.Vedle Řešení zvolte z rozevíracího seznamu položku Přidat do řešení.Do stejného řešení, které obsahuje knihovnu DLL, bude přidán nový projekt.Klikněte na tlačítko OK.
Na stránce Přehled v dialogovém okně Průvodci aplikace Win32 klikněte na tlačítko Další.
Na stránce Nastavení aplikace pod Typ aplikace klikněte na položku Konzolová aplikace.
Na stránce Nastavení aplikace v oddílu Další možnosti odškrtněte zaškrtávací políčko Předkompilovaná hlavička.
Klikněte pro vytvoření projektu na položku Dokončit.
Využití funkcí z knihovny tříd v aplikaci
Po vytvoření nové konzolové aplikace 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.
Aby bylo možné matematické operace vytvořené v knihovně DLL použít v aplikaci, je nutné je referencovat.To lze provést výběrem projektu MyExecRefsDll z Průzkumníka řešení a následně v panelu nabídek kliknutím na položku Projekt a nakonec na položku Odkazy.V dialogovém okně Stránky vlastností rozbalte uzel Společná nastavení, zvolte Rámec a odkazy a pak klikněte na tlačítko Přidat nové odkazy….Další informace o dialogovém okně Odkazy naleznete v tématu Architektura a odkazy, Společná nastavení, Dialogové okno <Projectname> Stránky vlastností.
Dialogové okno Přidat odkaz obsahuje seznam všech knihoven, které lze odkazovat.Karta Projekt obsahuje seznam všech projektů v aktuálním řešení a všechny knihovny, které obsahují.Na kartě Projekty zaškrtněte políčko vedle MathFuncsDll a následně klikněte na tlačítko OK.
Pro odkazování na soubory hlaviček knihovny DLL, je třeba změnit obsažené cesty adresářů.Chcete-li to provést, v dialogovém okně Stránky vlastností, rozbalte uzel Vlastnosti konfigurace, rozbalte uzel C/C++ a pak vyberte Obecné.Vedle položky Další vložené adresáře zadejte cestu k umístění souboru hlavičky MathFuncsDll.h.Lze použít relativní cestu, například. ..\MathFuncsDll\. Následně klikněte na tlačítko OK.
Třídu MyMathFuncs lze nyní použít v této aplikaci.Nahraďte obsah MyExecRefsDll.CPP následujícím kódem:
// 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 projekt kliknutím na Sestavit řešení v nabídce Sestavení.
Spuštění aplikace
Ujistěte se, že MyExecRefsDll je zvolen jako výchozí projekt.V Průzkumníku řešení vyberte MyExecRefsDll a poté v panelu nabídek klikněte na položku Projekt a nakonec na položku Nastavit jako výchozí projekt.
Kliknutím na položku Spustit bez ladění v nabídce Ladění spusťte projekt.Výstup by měl vypadat takto:
a + b = 106.4 a - b = -91.6 a * b = 732.6 a / b = 0.0747475 Zachycena výjimka: b nemůže být 0!
Další kroky
Předchozí téma:Knihovny DLL jazyka Visual C++ | Další téma:Jak: Vytvoření knihoven tříd
Viz také
Úkoly
Walkthrough: Deploying Your Program (C++)
Koncepty
Knihovny DLL jazyka Visual C++
Volání funkcí knihovny DLL z aplikací Visual Basic