Návod: vytvoření a použití vlastní knihovny DLL (C++)

v tomto podrobném návodu se dozvíte, jak použít Visual Studio IDE k vytvoření vlastní knihovny DLL (dynamic link library) napsané v Microsoft C++ (MSVC). Pak ukazuje, jak použít knihovnu DLL z jiné aplikace C++. knihovny dll (známé také jako sdílené knihovny v operačních systémech systém UNIX) jsou jedním z nejužitečnější druhy Windows komponent. Můžete je použít jako způsob, jak sdílet kód a prostředky a zmenšit velikost svých aplikací. Knihovny DLL také usnadňují službu a rozšiřování aplikací.

V tomto návodu vytvoříte knihovnu DLL, která implementuje některé matematické funkce. Pak vytvoříte konzolovou aplikaci, která používá funkce z knihovny DLL. získáte také úvod k některým programovacím technikům a konvencím používaným v Windowsch knihovnách dll.

Tento názorný postup se zabývá následujícími úlohami:

  • Vytvořte projekt knihovny DLL v Visual Studio.

  • Do knihovny DLL přidejte exportované funkce a proměnné.

  • Vytvořte projekt konzolové aplikace v Visual Studio.

  • Použijte funkce a proměnné importované z knihovny DLL v konzolové aplikaci.

  • Spusťte dokončenou aplikaci.

Podobně jako staticky propojená knihovna, knihovna DLL exportuje proměnné, funkce a prostředky podle názvu. Klientská aplikace importuje názvy pro použití proměnných, funkcí a prostředků. na rozdíl od staticky propojené knihovny Windows spojuje importy v aplikaci s exporty v knihovně DLL v době načítání nebo v době běhu, namísto jejich propojení v době připojení. Windows vyžaduje další informace, které nejsou součástí modelu kompilace standard C++, aby bylo možné tato připojení vytvořit. kompilátor MSVC implementuje v jazyce C++ některá rozšíření specifická pro společnost Microsoft, která poskytují tyto dodatečné informace. Tato rozšíření Vysvětleme.

tento návod vytvoří dvě Visual Studio řešení, jednu, která sestaví knihovnu DLL, a jednu, která vytvoří klientskou aplikaci. Knihovna DLL používá konvenci volání jazyka C. Dá se volat z aplikací napsaných v jiných programovacích jazycích, pokud se shoda platforem, konvencí volání a konvence propojení shodují. klientská aplikace používá implicitní propojení, kde Windows propojuje aplikaci s knihovnou DLL při načtení. Toto propojení umožňuje, aby aplikace zavolala funkce poskytnuté knihovnou DLL stejně jako funkce ve staticky propojené knihovně.

Tento návod nezahrnuje některé běžné situace. Kód nezobrazuje použití knihoven DLL jazyka C++ v jiných programovacích jazycích. Neukazuje, jak vytvořit knihovnu DLL s pouze prostředkynebo jak použít explicitní propojení s knihovnou DLL v době běhu, nikoli při načtení. vše, co je dobré, můžete k tomu použít MSVC a Visual Studio.

Odkazy na Další informace o knihovnách DLL naleznete v tématu Create C/C++ dlls in Visual Studio. Další informace o implicitním propojení a explicitním propojení najdete v tématu určení, kterou propojovací metodu použít. Informace o vytváření knihoven DLL C++ pro použití s programovacími jazyky, které používají konvence propojení jazyka C, naleznete v tématu Export funkcí jazyka c++ pro použití ve spustitelných souborech jazyka c. informace o tom, jak vytvořit knihovny dll pro použití s jazyky rozhraní .net, naleznete v tématu volání funkcí knihovny dll z aplikací Visual Basic.

Požadavky

  • počítač se systémem Microsoft Windows 7 nebo novější verze. pro nejlepší vývojové prostředí doporučujeme nejnovější verzi Windows.
  • Kopie Visual Studio. informace o tom, jak stáhnout a nainstalovat Visual Studio, najdete v tématu instalace Visual Studio. Když spustíte instalační program, ujistěte se, že je zaškrtnuté políčko vývoj desktopových aplikací v jazyce C++ . Nedělejte si starosti, pokud jste nenainstalovali tuto úlohu, když jste nainstalovali Visual Studio. Instalační program můžete spustit znovu a nainstalovat hned.

    Instalační program pro Visual Studio, vývoj desktopových aplikací pomocí C++.

  • Kopie Visual Studio. informace o tom, jak stáhnout a nainstalovat Visual Studio 2015, najdete v tématu instalace Visual Studio 2015. Použijte vlastní instalaci pro instalaci kompilátoru a nástrojů jazyka C++, protože nejsou nainstalovány ve výchozím nastavení.
  • porozumění základům používání Visual Studio integrované vývojové prostředí (IDE) pokud jste už Windows desktopové aplikace používali, můžete si ho nechat dál. úvod najdete v tématu prohlídky funkcí Visual Studio IDE.

  • Porozumění dostatek základních jazyků jazyka C++, které se mají sledovat. Nedělejte si starosti, nemůžeme nic složitě.

Poznámka

tento návod předpokládá, že používáte Visual Studio 2017 verze 15,9 nebo novější. některé starší verze Visual Studio 2017 obsahovaly vady v šablonách kódu nebo používaly jiná dialogová okna uživatelského rozhraní. chcete-li předejít problémům, použijte Instalační program pro Visual Studio k aktualizaci Visual Studio 2017 na verzi 15,9 nebo novější.

Vytvoření projektu knihovny DLL

V této sadě úkolů vytvoříte projekt pro knihovnu DLL, přidáte kód a sestavíte jej. začněte tím, že spustíte Visual Studio integrované vývojové prostředí (IDE) a přihlásíte se, pokud potřebujete. pokyny se mírně liší v závislosti na verzi Visual Studio, kterou používáte. Ujistěte se, že je v ovládacím prvku v levém horním rohu této stránky vybraná správná verze.

vytvoření projektu knihovny DLL v Visual Studio 2019

  1. na panelu nabídek vyberte soubornovýProject . otevře se dialogové okno vytvořit nový Project .

    Snímek obrazovky dialogového okna vytvořit nový projekt se zvýrazněnou šablonou knihovny dynamického propojení

  2. v horní části dialogového okna nastavte jazyk na C++, nastavte platformu na Windowsa nastavte Project typ na Library.

  3. Z filtrovaného seznamu typů projektů vyberte dynamická knihovna (DLL)a pak klikněte na tlačítko Další.

  4. na stránce konfigurovat nový projekt zadejte do pole Project názevMathLibrary a zadejte název projektu. Ponechte výchozí umístění a hodnoty názvu řešení . Nastavte řešení na vytvořit nové řešení. Zrušte zaškrtnutí políčka umístit řešení a projekt do stejného adresáře , pokud je zaškrtnuto.

  5. Kliknutím na tlačítko vytvořit vytvořte projekt.

Po vytvoření řešení můžete zobrazit vygenerovaný projekt a zdrojové soubory v okně Průzkumník řešení v Visual Studio.

Snímek obrazovky okna Průzkumník řešení s zvýrazněným projektem matematické knihovny

vytvoření projektu knihovny DLL v Visual Studio 2017

  1. na panelu nabídek vyberte soubornovýProject . otevře se dialogové okno nový Project .

  2. v levém podokně dialogového okna nový Project vyberte možnost nainstalovanéVisual C++Windows plocha. V prostředním podokně vyberte Knihovna DLL (Dynamic-Link Library). Do pole název zadejte MathLibrary a zadejte název projektu. Ponechte výchozí umístění a hodnoty názvu řešení . Nastavte řešení na vytvořit nové řešení. Pokud není zaškrtnuté, vyhledejte v řešení vytvořit adresář .

    snímek obrazovky s dialogovým oknem nový Project zobrazující v textovém poli název knihovnu Math.

  3. Kliknutím na tlačítko OK vytvořte projekt.

Po vytvoření řešení můžete zobrazit vygenerovaný projekt a zdrojové soubory v okně Průzkumník řešení v Visual Studio.

Snímek obrazovky okna Průzkumník řešení se zvýrazněnou knihovnou Math

vytvoření projektu knihovny DLL v Visual Studio 2015 a starších verzích

  1. na panelu nabídek vyberte soubornovýProject.

  2. v levém podokně dialogového okna nový Project rozbalte položku nainstalovanéšablonya vyberte možnost Visual C++a potom v prostředním podokně vyberte možnost konzolová aplikace Win32. Zadáním MathLibrary do textového pole název zadejte název projektu. Ponechte výchozí umístění a hodnoty názvu řešení . Nastavte řešení na vytvořit nové řešení. Pokud není zaškrtnuté, vyhledejte v řešení vytvořit adresář .

    snímek obrazovky s dialogovým oknem nový Project zobrazující v textovém poli název knihovnu Math.

  3. kliknutím na tlačítko OK zavřete dialogové okno nový Project a spusťte průvodce aplikací Win32.

    Snímek obrazovky se stránkou s přehledem Průvodce aplikací Win32.

  4. Klikněte na tlačítko Další . na stránce aplikace Nastavení v části typ aplikacevyberte možnost knihovna DLL.

    snímek obrazovky Nastavení stránky aplikace průvodce aplikací Win32.

  5. Kliknutím na tlačítko Dokončit vytvořte projekt.

Po dokončení řešení průvodce uvidíte vygenerovaný projekt a zdrojové soubory v okně Průzkumník řešení v Visual Studio.

Snímek obrazovky Průzkumník řešení s oknem Matematické knihovny zvýrazněnou

V tuto chytu tato knihovna DLL toho moc nenadá. Dále vytvoříte soubor hlaviček, který deklaruje funkce exportují knihovny DLL, a pak do knihovny DLL přidáte definice funkcí, aby byl užitečnější.

Přidání souboru hlaviček do knihovny DLL

  1. Pokud chcete vytvořit soubor hlaviček pro funkce, zvolte na řádku nabídek ProjectPřidat novou položku.

  2. V dialogovém okně Přidat novou položku v levém podokně vyberte Visual C++. V podokně uprostřed vyberte Header File (.h) (Soubor hlaviček (.h). Jako název souboru hlaviček zadejte MathLibrary.h.

    Snímek obrazovky s dialogem Přidat novou položku a vybranou šablonou C plus soubor hlavičky a textem MathLibrary.h zadaným do textového pole Název

  3. Zvolte tlačítko Přidat a vygenerujte prázdný soubor hlaviček, který se zobrazí v novém okně editoru.

    Snímek obrazovky s prázdným souborem MathLibrary.h v editoru

  4. Obsah souboru hlaviček nahraďte tímto kódem:

    // MathLibrary.h - Contains declarations of math functions
    #pragma once
    
    #ifdef MATHLIBRARY_EXPORTS
    #define MATHLIBRARY_API __declspec(dllexport)
    #else
    #define MATHLIBRARY_API __declspec(dllimport)
    #endif
    
    // The Fibonacci recurrence relation describes a sequence F
    // where F(n) is { n = 0, a
    //               { n = 1, b
    //               { n > 1, F(n-2) + F(n-1)
    // for some initial integral values a and b.
    // If the sequence is initialized F(0) = 1, F(1) = 1,
    // then this relation produces the well-known Fibonacci
    // sequence: 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
    
    // Initialize a Fibonacci relation sequence
    // such that F(0) = a, F(1) = b.
    // This function must be called before any other function.
    extern "C" MATHLIBRARY_API void fibonacci_init(
        const unsigned long long a, const unsigned long long b);
    
    // Produce the next value in the sequence.
    // Returns true on success and updates current value and index;
    // false on overflow, leaves current value and index unchanged.
    extern "C" MATHLIBRARY_API bool fibonacci_next();
    
    // Get the current value in the sequence.
    extern "C" MATHLIBRARY_API unsigned long long fibonacci_current();
    
    // Get the position of the current value in the sequence.
    extern "C" MATHLIBRARY_API unsigned fibonacci_index();
    

Tento soubor hlaviček deklaruje některé funkce pro vytvoření zobecněné Fibonacciho posloupnosti, která je dána dvěma počátečními hodnotami. Volání fibonacci_init(1, 1) vygeneruje známou Fibonacciho číselnou posloupnost.

Všimněte si příkazů preprocesoru v horní části souboru. Nová šablona projektu pro projekt knihovny DLL přidá <PROJECTNAME>_EXPORTS do definovaných maker preprocesoru. V tomto příkladu Visual Studio, MATHLIBRARY_EXPORTS kdy je sestaven projekt knihovny DLL MathLibrary.

Když je MATHLIBRARY_EXPORTS makro definováno, MATHLIBRARY_API nastaví makro __declspec(dllexport) modifikátor na deklaracích funkce. Tento modifikátor říká kompilátoru a linkeru, aby export funkce nebo proměnné z knihovny DLL pro použití jinými aplikacemi. Pokud není definován, například když je soubor hlaviček zahrnutý klientskou aplikací, použije MATHLIBRARY_EXPORTSMATHLIBRARY_API__declspec(dllimport) modifikátor na deklarace. Tento modifikátor optimalizuje import funkce nebo proměnné v aplikaci. Další informace najdete v tématu dllexport, dllimport.

Přidání implementace do knihovny DLL

  1. V Průzkumník řešení klikněte pravým tlačítkem na uzel Zdrojové souboryazvolte Přidatnovou položku. Vytvořte nový soubor .cpp s názvem MathLibrary.cppstejným způsobem, jakým jste v předchozím kroku přidali nový soubor hlaviček.

  2. V okně editoru vyberte kartu MathLibrary.cpp, pokud je už otevřená. Pokud ne, v Průzkumník řešeníotevřete soubor MathLibrary.cpp ve složce Zdrojové soubory projektu MathLibrary.

  3. V editoru nahraďte obsah souboru MathLibrary.cpp následujícím kódem:

    // MathLibrary.cpp : Defines the exported functions for the DLL.
    #include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier
    #include <utility>
    #include <limits.h>
    #include "MathLibrary.h"
    
    // DLL internal state variables:
    static unsigned long long previous_;  // Previous value, if any
    static unsigned long long current_;   // Current sequence value
    static unsigned index_;               // Current seq. position
    
    // Initialize a Fibonacci relation sequence
    // such that F(0) = a, F(1) = b.
    // This function must be called before any other function.
    void fibonacci_init(
        const unsigned long long a,
        const unsigned long long b)
    {
        index_ = 0;
        current_ = a;
        previous_ = b; // see special case when initialized
    }
    
    // Produce the next value in the sequence.
    // Returns true on success, false on overflow.
    bool fibonacci_next()
    {
        // check to see if we'd overflow result or position
        if ((ULLONG_MAX - previous_ < current_) ||
            (UINT_MAX == index_))
        {
            return false;
        }
    
        // Special case when index == 0, just return b value
        if (index_ > 0)
        {
            // otherwise, calculate next sequence value
            previous_ += current_;
        }
        std::swap(current_, previous_);
        ++index_;
        return true;
    }
    
    // Get the current value in the sequence.
    unsigned long long fibonacci_current()
    {
        return current_;
    }
    
    // Get the current index position in the sequence.
    unsigned fibonacci_index()
    {
        return index_;
    }
    
  1. V okně editoru vyberte kartu MathLibrary.cpp, pokud je už otevřená. Pokud ne, v Průzkumník řešeníotevřete soubor MathLibrary.cpp ve složce Zdrojové soubory projektu MathLibrary.

  2. V editoru nahraďte obsah souboru MathLibrary.cpp následujícím kódem:

    // MathLibrary.cpp : Defines the exported functions for the DLL.
    #include "stdafx.h" // use pch.h in Visual Studio 2019 and later
    #include <utility>
    #include <limits.h>
    #include "MathLibrary.h"
    
    // DLL internal state variables:
    static unsigned long long previous_;  // Previous value, if any
    static unsigned long long current_;   // Current sequence value
    static unsigned index_;               // Current seq. position
    
    // Initialize a Fibonacci relation sequence
    // such that F(0) = a, F(1) = b.
    // This function must be called before any other function.
    void fibonacci_init(
        const unsigned long long a,
        const unsigned long long b)
    {
        index_ = 0;
        current_ = a;
        previous_ = b; // see special case when initialized
    }
    
    // Produce the next value in the sequence.
    // Returns true on success, false on overflow.
    bool fibonacci_next()
    {
        // check to see if we'd overflow result or position
        if ((ULLONG_MAX - previous_ < current_) ||
            (UINT_MAX == index_))
        {
            return false;
        }
    
        // Special case when index == 0, just return b value
        if (index_ > 0)
        {
            // otherwise, calculate next sequence value
            previous_ += current_;
        }
        std::swap(current_, previous_);
        ++index_;
        return true;
    }
    
    // Get the current value in the sequence.
    unsigned long long fibonacci_current()
    {
        return current_;
    }
    
    // Get the current index position in the sequence.
    unsigned fibonacci_index()
    {
        return index_;
    }
    

Pokud chcete ověřit, že všechno zatím funguje, zkompilujte dynamickou knihovnu propojení. Pokud chcete kompilovat, zvoltena řádku nabídek Build Build Solution (Sestavit řešení sestavení). Knihovna DLL a související výstup kompilátoru jsou umístěné ve složce s názvem Debug přímo pod složku řešení. Pokud vytvoříte sestavení pro vydání, výstup se umístí do složky s názvem Release. Výstup by měl vypadat přibližně takto:

1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------
1>pch.cpp
1>dllmain.cpp
1>MathLibrary.cpp
1>Generating Code...
1>   Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------
1>stdafx.cpp
1>dllmain.cpp
1>MathLibrary.cpp
1>Generating Code...
1>   Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
1>------ Build started: Project: MathLibrary, Configuration: Debug Win32 ------
1>MathLibrary.cpp
1>dllmain.cpp
1>Generating Code...
1>   Creating library C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.lib and object C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.exp
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.dll
1>MathLibrary.vcxproj -> C:\Users\username\Source\Repos\MathLibrary\Debug\MathLibrary.pdb (Partial PDB)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

Blahopřejeme, vytvořili jste knihovnu DLL pomocí Visual Studio! Dále vytvoříte klientskou aplikaci, která používá funkce exportované knihovnou DLL.

Vytvoření klientské aplikace, která používá knihovnu DLL

Při vytváření knihovny DLL se zamyslete nad tím, jak ji klientské aplikace mohou používat. Aby bylo možné volat funkce nebo přistupovat k datům exportovaných knihovnou DLL, musí mít zdrojový kód klienta deklarace dostupné v době kompilace. V době propojení linker vyžaduje informace k vyřešení volání funkce nebo přístupu k datům. Knihovna DLL poskytuje tyto informace v knihovně importu, souboru , který obsahuje informace o tom, jak najít funkce a data, namísto skutečného kódu. A za běhu musí být knihovna DLL dostupná klientovi v umístění, které může najít operační systém.

Bez ohledu na to, jestli je to váš vlastní projekt nebo projekt klientské aplikace třetí strany, potřebuje k použití knihovny DLL několik informací. Musí najít hlavičky, které deklarují exporty knihoven DLL, knihovny importu pro linker a samotnou knihovnu DLL. Jedním z řešení je zkopírovat všechny tyto soubory do klientského projektu. U knihoven DLL třetích stran, které se pravděpodobně během vývoje vašeho klienta nemění, může být tato metoda nejlepším způsobem, jak je používat. Pokud ale také sestavíte knihovnu DLL, je lepší se vyhnout duplikaci. Pokud místní kopii souborů DLL, které jsou ve vývoji, můžete nechtěně změnit hlavičkový soubor v jedné kopii, ale ne v jiné, nebo použít zastaralé knihovny.

Abyste zabránili nesynchronnímu kódu, doporučujeme nastavit cestu k zahrnutí v klientském projektu tak, aby zahrnovala soubory hlaviček knihovny DLL přímo z projektu knihovny DLL. Nastavte také cestu ke knihovně v klientském projektu tak, aby zahrnovala knihovny importu knihoven knihovny DLL z projektu knihovny DLL. Nakonec zkopírujte sestavenou knihovnu DLL z projektu knihovny DLL do výstupního adresáře sestavení klienta. Tento krok umožňuje klientské aplikaci používat stejný kód knihovny DLL, který sestavíte.

Vytvoření klientské aplikace v Visual Studio

  1. V řádku nabídek zvolteSoubor nový Project a otevřete dialogové okno Vytvořit nový projekt.

  2. V horní části dialogového okna nastavte Jazyk na C++,platformu na Windowsa typ Project naKonzola.

  3. Ve filtrovaném seznamu typů projektů zvolte Konzolová aplikace a pak zvolte Další.

  4. Na stránce Configure your new project (Konfigurace nového projektu) zadejte do pole Project name (Název projektu) mathClient a zadejte název projektu. Ponechte výchozí hodnoty Umístění a Název řešení. Nastavte Řešenína Vytvořit nové řešení. Zrušte zaškrtnutí políčka Umístit řešení a projekt do stejného adresáře, pokud je zaškrtnuté.

    Snímek obrazovky dialogového okna Vytvořit nový projekt se zvýrazněnou možností Konzolová aplikace

  5. Zvolte tlačítko Vytvořit a vytvořte projekt klienta.

Vytvoří se pro vás minimální projekt konzolové aplikace. Název hlavního zdrojového souboru je stejný jako název projektu, který jste zadali dříve. V tomto příkladu má název MathClient.cpp. Můžete ho sestavit, ale vaše knihovna DLL ještě nepou3/4í.

Vytvoření klientské aplikace v Visual Studio 2017

  1. Pokud chcete vytvořit aplikaci C++, která používá knihovnu DLL, kterou jste vytvořili, na řádku nabídek zvolte SoubornovýProject.

  2. V levém podokně dialogového okna Nový Project vyberte Windows Desktop včásti Nainstalováno Visual C++. V podokně uprostřed vyberte Windows konzolová aplikace. Do textového pole Název zadejte název projektu MathClient. Ponechte výchozí hodnoty Umístění a Název řešení. Nastavte Řešenína Vytvořit nové řešení. Pokud není tato možnost zaškrtnutá, zaškrtněte políčko Vytvořit adresář pro řešení.

    Screenshot of the New Project dialog box with Installed > Visual C plus plus > Windows Desktop selected, Windows Console Application highlighted, and Math Client typed in the Name text box.Snímek obrazovky s dialogem Nový Project a vybraným nainstalovaným visual c plus zvýrazněnou konzolovou aplikací Windows a matematickým klientem, který jste napsali do textového pole Název

  3. Zvolte OK a vytvořte projekt klientské aplikace.

Vytvoří se pro vás minimální projekt konzolové aplikace. Název hlavního zdrojového souboru je stejný jako název projektu, který jste zadali dříve. V tomto příkladu má název MathClient.cpp. Můžete ho sestavit, ale vaše knihovna DLL ještě nepou3/4í.

Vytvoření klientské aplikace v Visual Studio 2015

  1. Pokud chcete vytvořit aplikaci C++, která používá knihovnu DLL, kterou jste vytvořili, na řádku nabídek zvolte SoubornovýProject.

  2. V levém podokně dialogového okna Nový Project vyberte Win32 v části NainstalovanéšablonyVisual C++. V podokně uprostřed vyberte Konzolová aplikace Win32. Do textového pole Název zadejte název projektu MathClient. Ponechte výchozí hodnoty Umístění a Název řešení. Nastavte Řešenína Vytvořit nové řešení. Pokud není tato možnost zaškrtnutá, zaškrtněte políčko Vytvořit adresář pro řešení.

    Screenshot of the New Project dialog box with Installed > Templates > Visual C plus plus > Win32 selected, Win32 Console Application Visual C plus plus highlighted, and Math Client typed in the Name text box.Snímek obrazovky s dialogem Nový Project s nainstalovanými šablonami Visual C a vybraným zvýrazněnou možností Konzolová aplikace Win32 Visual C plus plus a matematickým klientem v textovém poli Název

  3. Kliknutím na tlačítko OK zavřete dialogové okno Project a spusťte Průvodce aplikací Win32. Na stránce Přehled v dialogovém okně Průvodce aplikací Win32 zvolte tlačítko Další.

  4. Na stránce Nastavení aplikace v části Typ aplikacevyberte Konzolová aplikace, pokud ještě není vybraná.

  5. Zvolte tlačítko Dokončit a vytvořte projekt.

Po dokončení průvodce se pro vás vytvoří minimální projekt konzolové aplikace. Název hlavního zdrojového souboru je stejný jako název projektu, který jste zadali dříve. V tomto příkladu má název MathClient.cpp. Můžete ho sestavit, ale vaše knihovna DLL ještě nepou3/4í.

Dále pro volání funkcí MathLibrary ve zdrojovém kódu musí projekt zahrnovat soubor MathLibrary. h . Tento hlavičkový soubor můžete zkopírovat do projektu klientské aplikace a pak ho přidat do projektu jako existující položku. Tato metoda může být dobrou volbou pro knihovny třetích stran. Nicméně pokud pracujete na kódu pro knihovnu DLL a klienta současně, soubory hlaviček by mohly být mimo synchronizaci. Chcete-li se tomuto problému vyhnout, nastavte cestu k dalším adresářům include v projektu tak, aby zahrnovala cestu k původní hlavičce.

Přidání hlavičky knihovny DLL do cesty k zahrnutí

  1. Kliknutím pravým tlačítkem myši na uzel MathClient v Průzkumník řešení otevřete dialogové okno stránky vlastností .

  2. V rozevíracím seznamu Konfigurace vyberte možnost všechny konfigurace , pokud ještě není vybraná.

  3. V levém podokně vyberte Možnosti konfiguraceC/C++Obecné.

  4. V podokně vlastností zaškrtněte políčko vedle rozevíracího seznamu Další vložené adresáře a pak zvolte Upravit.

    Snímek obrazovky dialogového okna stránky vlastností zobrazující příkaz Edit v rozevíracím seznamu další vlastnosti adresářů zahrnutí .

  5. Pokud chcete povolit ovládací prvek pro úpravy, poklikejte na horní podokno dialogového okna Další vložené adresáře . Případně můžete vybrat ikonu složky a vytvořit novou položku.

  6. V ovládacím prvku pro úpravy zadejte cestu k umístění souboru hlaviček MathLibrary. h . Můžete vybrat ovládací prvek se třemi tečkami (...) a přejít do správné složky.

    Můžete také zadat relativní cestu ze zdrojových souborů klienta do složky, která obsahuje soubory hlaviček DLL. Pokud jste postupovali podle pokynů k umístění projektu klienta do samostatného řešení z knihovny DLL, relativní cesta by měla vypadat takto:

    ..\..\MathLibrary\MathLibrary

    Pokud je vaše knihovna DLL a klientské projekty ve stejném řešení, relativní cesta může vypadat takto:

    ..\MathLibrary

    Pokud jsou knihovny DLL a klientské projekty v jiných složkách, upravte relativní cestu tak, aby odpovídala. Případně můžete vyhledat složku pomocí ovládacího prvku tři tečky.

    Snímek obrazovky dialogového okna další adresáře pro zahrnutí, kde se zobrazuje relativní cesta k adresáři MathLibrary .

  7. Po zadání cesty k souboru hlaviček v dialogovém okně Další vložené adresáře klikněte na tlačítko OK . V dialogovém okně stránky vlastností kliknutím na tlačítko OK uložte změny.

Nyní můžete zahrnout soubor MathLibrary. h a používat funkce, které deklaruje v klientské aplikaci. Nahraďte obsah MathClient. cpp pomocí tohoto kódu:

// MathClient.cpp : Client app for MathLibrary DLL.
// #include "pch.h" Uncomment for Visual Studio 2017 and earlier
#include <iostream>
#include "MathLibrary.h"

int main()
{
    // Initialize a Fibonacci relation sequence.
    fibonacci_init(1, 1);
    // Write out the sequence values until overflow.
    do {
        std::cout << fibonacci_index() << ": "
            << fibonacci_current() << std::endl;
    } while (fibonacci_next());
    // Report count of values written before overflow.
    std::cout << fibonacci_index() + 1 <<
        " Fibonacci sequence values fit in an " <<
        "unsigned 64-bit integer." << std::endl;
}

Tento kód může být zkompilován, ale není propojen. Pokud nyní vytvoříte klientskou aplikaci, zobrazí se v seznamu chyb několik chyb LINKERŮ LNK2019. To je způsobeno tím, že v projektu chybí některé informace: neurčili jste, že váš projekt má ještě závislost na knihovně MathLibrary. lib . A, neřekli jste linker, jak najít soubor MathLibrary. lib .

Chcete-li tento problém vyřešit, můžete zkopírovat soubor knihovny přímo do projektu klientské aplikace. Linker ho najde a použije automaticky. Pokud je však knihovna i klientská aplikace ve vývoji, může to vést k změnám v jedné kopii, která není zobrazená v druhé. Chcete-li se tomuto problému vyhnout, můžete nastavit vlastnost Další závislosti a sdělit systému sestavení, že váš projekt závisí na MathLibrary. lib. A v projektu můžete nastavit další cestu k adresářům knihovny , aby při propojení zahrnovala cestu k původní knihovně.

Přidání knihovny pro import knihoven DLL do projektu

  1. V Průzkumník řešení klikněte pravým tlačítkem myši na uzel MathClient a kliknutím na vlastnosti otevřete dialogové okno stránky vlastností .

  2. V rozevíracím seznamu Konfigurace vyberte možnost všechny konfigurace , pokud ještě není vybraná. Zajišťuje, aby se všechny změny vlastností projevily pro sestavení ladění i vydaných verzí.

  3. V levém podokně vyberte Konfigurace vlastnostilinkerinput. V podokně vlastností zaškrtněte políčko vedle rozevíracího seznamu Další závislosti a pak zvolte Upravit.

    Snímek obrazovky dialogového okna stránky vlastností znázorňující příkaz pro úpravy v linkeru >Rozevírací seznam dalších vlastností vstupních závislostí.

  4. V dialogovém okně Další závislosti přidejte MathLibrary. lib do seznamu v horním ovládacím prvku pro úpravy.

    Snímek obrazovky dialogového okna Další závislosti zobrazující soubor MathLibrary. lib

  5. Kliknutím na tlačítko OK se vraťte do dialogového okna stránky vlastností .

  6. V levém podokně vyberte konfigurační vlastnostilinkerObecné. V podokně vlastností vyberte rozevírací seznam vedle pole Další adresáře knihovny upravit a pak zvolte Upravit.

    Snímek obrazovky dialogového okna stránky vlastností znázorňující příkaz pro úpravy v linkeru  Obecné > Další vlastnosti adresářů knihoven – rozevírací seznam .

  7. Dvojitým kliknutím v horním podokně dialogového okna Další adresáře knihovny povolíte ovládací prvek pro úpravy. V ovládacím prvku pro úpravy zadejte cestu k umístění souboru MathLibrary. lib . Ve výchozím nastavení se nachází ve složce s názvem ladění přímo ve složce řešení dll. Pokud vytvoříte sestavení pro vydání, soubor se umístí do složky s názvem release. Můžete použít makro, $(IntDir) aby linker mohl najít vaši knihovnu DLL bez ohledu na to, který typ sestavení vytvoříte. Pokud jste postupovali podle pokynů k umístění projektu klienta do samostatného řešení z projektu knihovny DLL, relativní cesta by měla vypadat takto:

    ..\..\MathLibrary\$(IntDir)

    Pokud je vaše knihovna DLL a klientské projekty v jiných umístěních, upravte relativní cestu tak, aby odpovídala.

    Snímek obrazovky dialogového okna další adresáře knihovny

  8. Jakmile zadáte cestu k souboru knihovny v dialogovém okně Další adresáře knihovny , klikněte na tlačítko OK , čímž se vrátíte do dialogového okna stránky vlastností . Kliknutím na tlačítko OK uložte změny vlastností.

Klientská aplikace se teď může kompilovat a propojit úspěšně, ale pořád nemá vše, co potřebuje ke spuštění. Když operační systém načte vaši aplikaci, vyhledá MathLibrary DLL. Pokud knihovna DLL nenajde v určitých systémových adresářích, cestě k prostředí nebo adresáři místní aplikace, zatížení se nepodaří. V závislosti na operačním systému se zobrazí chybová zpráva podobná této:

Snímek obrazovky s chybovým dialogem, MathLibrary knihovna DLL nebyla nalezena.

Jedním ze způsobů, jak se tomuto problému vyhnout, je zkopírovat knihovnu DLL do adresáře, který obsahuje spustitelný soubor klienta jako součást procesu sestavení. Můžete přidat událost po sestavení do projektu a přidat příkaz, který zkopíruje knihovnu DLL do výstupního adresáře sestavení. Zadaný příkaz zkopíruje knihovnu DLL pouze v případě, že chybí nebo se změnila. Používá makra ke kopírování do a z umístění pro ladění nebo vydání na základě konfigurace sestavení.

Zkopírování knihovny DLL v události po sestavení

  1. V Průzkumník řešení klikněte pravým tlačítkem myši na uzel MathClient a kliknutím na vlastnosti otevřete dialogové okno stránky vlastností .

  2. V rozevíracím seznamu Konfigurace vyberte možnost všechny konfigurace , pokud ještě není vybraná.

  3. V levém podokně vyberte Vlastnosti konfigurace událostsestaveníudálosti po sestavení.

  4. V podokně vlastností vyberte v poli příkazový řádek ovládací prvek pro úpravy. Pokud jste postupovali podle pokynů k umístění projektu klienta do samostatného řešení z projektu knihovny DLL, pak zadejte tento příkaz:

    xcopy /y /d "..\..\MathLibrary\$(IntDir)MathLibrary.dll" "$(OutDir)"

    Pokud je vaše knihovna DLL a klientské projekty v jiných adresářích, změňte relativní cestu k knihovně DLL tak, aby odpovídala.

    Snímek obrazovky dialogového okna stránky vlastností zobrazující vlastnost příkazového řádku události po sestavení

  5. Kliknutím na tlačítko OK uložte změny vlastností projektu.

Klientská aplikace teď má všechno, co potřebuje k sestavování a spouštění. Sestavte aplikaci tak, že na řádku nabídek kliknete na sestavitřešení sestavení . okno výstup v Visual Studio by mělo mít v závislosti na vaší verzi Visual Studio něco podobného jako v následujícím příkladu:

1>------ Build started: Project: MathClient, Configuration: Debug Win32 ------
1>MathClient.cpp
1>MathClient.vcxproj -> C:\Users\username\Source\Repos\MathClient\Debug\MathClient.exe
1>1 File(s) copied
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

Gratulujeme, vytvořili jste aplikaci, která volá funkce v knihovně DLL. Nyní spusťte aplikaci, abyste viděli, co dělá. Na panelu nabídek vyberte možnost laditSpustit bez ladění. Visual Studio otevře okno příkazového řádku, ve kterém se má program spustit. Poslední část výstupu by měla vypadat takto:

Snímek obrazovky s výstupem příkazového řádku při spuštění klientské aplikace bez ladění

Stisknutím libovolné klávesy zavřete okno příkazového řádku.

Teď, když jste vytvořili knihovnu DLL a klientskou aplikaci, můžete experimentovat. Zkuste nastavit zarážky v kódu klientské aplikace a spusťte aplikaci v ladicím programu. Podívejte se, co se stane, když zadáte krok do volání knihovny. Do knihovny přidejte další funkce nebo napište jinou klientskou aplikaci, která používá vaši DLL knihovnu.

Při nasazení aplikace je nutné také nasadit knihovny DLL, které používá. Nejjednodušší způsob, jak vytvořit knihovny DLL, které sestavíte, nebo které jste zahrnuli ze třetích stran, je k dispozici, aby byly vloženy do stejného adresáře jako vaše aplikace. Je známý jako nasazení v místní aplikaci. Další informace o nasazení najdete v tématu nasazení v Visual C++.

Viz také

volání funkcí knihovny DLL z aplikací Visual Basic