Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a lépésenkénti útmutató bemutatja, hogyan hozhat létre saját dinamikus csatolású kódtárat (DLL) a Visual Studio IDE használatával a Microsoft C++ (MSVC) alkalmazásban, és hogyan használhatja a DLL-t egy másik C++ alkalmazásból. A UNIX-alapú operációs rendszerek megosztott kódtárainak is nevezett DLL-ek a Windows-összetevők egyik legkedvesebb típusai. Ezek használatával megoszthatja a kódot és az erőforrásokat, és csökkentheti az alkalmazások méretét. A DLL-ek még egyszerűbbé is tehetik az alkalmazások kiszolgálását és kiterjesztését.
Ebben az útmutatóban létrehoz egy DLL-t, amely implementál néhány matematikai függvényt. Ezután létre kell hoznia egy konzolalkalmazást, amely a DLL függvényeit használja. Emellett megismerkedhet a Windows DLL-ekben használt programozási technikákkal és konvenciókkal is.
Ez az útmutató a következő lépéseket ismerteti:
- DLL-projekt létrehozása a Visual Studióban.
- Exportált függvények és változók hozzáadása a DLL-hez.
- Konzolalkalmazás-projekt létrehozása a Visual Studióban.
- Használja a dll-ből a konzolalkalmazásban importált függvényeket és változókat.
- Futtassa a kész alkalmazást.
A statikusan csatolt kódtárakhoz hasonlóan a DLL-ek név alapján exportálják a változókat, függvényeket és erőforrásokat. Az ügyfélalkalmazások importálják a neveket a változók, függvények és erőforrások használatához. A statikusan csatolt kódtárakkal ellentétben a Windows az alkalmazás importjait a betöltési vagy futási időben kapcsolja össze a DLL exportjaival, nem pedig a csatolási időben. A Windowshoz olyan további információkra van szükség, amelyek nem részei a standard C++ fordítási modellnek a kapcsolatok létrehozásához. Az MSVC fordító implementál néhány Microsoft-specifikus bővítményt a C++-ra a további információk biztosításához. Ahogy haladunk, elmagyarázzuk ezeket a bővítményeket.
Ez az útmutató két Visual Studio-megoldást hoz létre: egyet a DLL-t, egyet pedig az ügyfélalkalmazást. A DLL a C hívási konvenciót használja. Meghívható más programozási nyelveken írt alkalmazásokból, amennyiben a platform, a hívási konvenciók és a csatolási konvenciók egyeznek. Az ügyfélalkalmazás implicit csatolást használ, ahol a Windows betöltési időben a DLL-hez csatolja az alkalmazást. Ez a csatolás lehetővé teszi, hogy az alkalmazás ugyanúgy hívja meg a DLL által biztosított függvényeket, mint a statikusan csatolt kódtárban lévő függvényeket.
Ez az útmutató nem fed le néhány gyakori helyzetet. A kód nem jeleníti meg a C++ DLL-ek más programozási nyelvek általi használatát. Nem mutatja be, hogyan hozhat létre csak erőforrás-alapú DLL-t, vagy hogyan használhat explicit csatolást a DLL-ek futási időben való betöltéséhez a betöltési idő helyett. Biztos lehet benne, hogy az MSVC és a Visual Studio használatával mindezt elvégezheti.
Annak ellenére, hogy a DLL kódja C++-ban van megírva, az exportált függvényekhez C stílusú interfészeket használunk. Ennek két fő oka van: Először is sok más nyelv támogatja a C-stílusú függvények importálását. Az ügyfélalkalmazást nem kell C++-ban írni. Másodszor, elkerül néhány gyakori buktatót az exportált osztályokhoz és tagfüggvényekhez kapcsolódóan. Az osztályok exportálása során könnyen diagnosztizálható hibák nehezen diagnosztizálhatók, mivel az osztálydeklarációban hivatkozott összes példánynak is exportálva kell legyen. Ez a korlátozás a DLL-ekre vonatkozik, a statikus kódtárakra azonban nem. Ha az osztályok "plain-old-data" stílusúak, akkor nem valószínű, hogy szembesülne ezzel a problémával.
A DLL-ekkel kapcsolatos további információkra mutató hivatkozásokért lásd: C/C++ DLL-ek létrehozása a Visual Studióban. Az implicit csatolásról és az explicit csatolásról további információt a használandó csatolási módszer meghatározása című témakörben talál. A C++ DLL-k C nyelvi kapcsolati konvencióit használó programozási nyelvekhez való létrehozásáról további információt a C++ függvények exportálása c nyelvű végrehajtható fájlokban való használatra című témakörben talál. A .NET-nyelvekhez használható DLL-címek létrehozásáról további információt a DLL-függvények meghívása Visual Basic-alkalmazásokból című témakörben talál.
Előfeltételek
- Microsoft Windows 7 vagy újabb. A legjobb fejlesztési élmény érdekében a Windows legújabb verzióját javasoljuk.
Visual Studió. A Visual Studio letöltéséről és telepítéséről a Visual Studio telepítése című témakörben olvashat. A telepítő futtatásakor győződjön meg arról, hogy a C++ számítási feladattal rendelkező asztali fejlesztés be van jelölve. Ne aggódjon, ha nem telepítette ezt a számítási feladatot a Visual Studio telepítésekor. A telepítőt újra futtathatja, és most telepítheti.
- Visual Studió. A Visual Studio 2015 letöltéséről és telepítéséről további információt a Visual Studio 2015 telepítése című témakörben talál. Egyéni telepítéssel telepítheti a C++ fordítót és az eszközöket, mivel alapértelmezés szerint nincsenek telepítve.
A Visual Studio IDE használatának alapjai. Ha korábban már használt asztali Windows-alkalmazásokat, valószínűleg lépést tarthat. Bevezetésként tekintse meg a Visual Studio IDE funkcióbemutatóját.
A C++ nyelv ismerete. Ne aggódj, nem csinálunk túl bonyolultat.
Megjegyzés:
Ez az útmutató feltételezi, hogy a Visual Studio 2017 15.9-es vagy újabb verzióját használja. A Visual Studio 2017 néhány korábbi verziója hibás volt a kódsablonokban, vagy különböző felhasználói felületi párbeszédpaneleket használt. A problémák elkerülése érdekében a Visual Studio Installer használatával frissítse a Visual Studio 2017-et a 15.9-es vagy újabb verzióra.
A DLL-projekt létrehozása
A következő feladatkészletben létrehoz egy projektet a DLL-hez, hozzáadja a kódot, és létrehozza azt. Először indítsa el a Visual Studio IDE-t, és jelentkezzen be, ha szükséges. Az utasítások kissé eltérhetnek attól függően, hogy a Visual Studio melyik verzióját használja. A Visual Studio előnyben részesített verziójának lépéseinek megtekintéséhez használja az oldal tartalomjegyzékének tetején található Verzióválasztót .
DLL-projekt létrehozása a Visual Studióban
A menüsávOn válassza azÚj>projekt> lehetőséget az Új projekt létrehozása párbeszédpanel megnyitásához.
A párbeszédpanel tetején állítsa a Nyelv elemet C++-ra, állítsa a PlatformotWindowsra, és állítsa a Projekt típusátkódtárra.
A projekttípusok szűrt listájában válassza a Dinamikus csatolású kódtár (DLL) lehetőséget, majd a Tovább gombot.
Az új projekt konfigurálása lapon írja be a MathLibrary kifejezést a Projekt neve mezőbe, és adja meg a projekt nevét. Hagyja meg az alapértelmezett Hely és megoldás névértékeket . A Megoldás beállítása új megoldás létrehozásához. Törölje a jelölést, ha be van jelölve a Megoldás és projekt elhelyezése ugyanabban a könyvtárban jelölőnégyzetet.
A projekt létrehozásához válassza a Létrehozás gombot.
A megoldás létrehozásakor a létrehozott projekt- és forrásfájlok a Visual Studio Megoldáskezelő ablakában láthatók.
DLL-projekt létrehozása a Visual Studio 2017-ben
A menüsávOn válassza azÚj>projekt> lehetőséget az Új projekt párbeszédpanel megnyitásához.
Az Új projekt párbeszédpanel bal oldali ablaktábláján válassza a Telepített>Visual C++>Windows Desktop lehetőséget. A középső panelen válassza a Dynamic-Link kódtár (DLL) lehetőséget. Írja be a MathLibrary nevet a Név mezőbe a projekt nevének megadásához. Hagyja meg az alapértelmezett Hely és megoldás névértékeket . A Megoldás beállítása új megoldás létrehozásához. Jelölje be a Megoldás számára címtár létrehozása lehetőséget, ha nincs bejelölve.
Kattintson az OK gombra a projekt létrehozásához.
A megoldás létrehozásakor a létrehozott projekt- és forrásfájlok a Visual Studio Megoldáskezelő ablakában láthatók.
DLL-projekt létrehozása a Visual Studio 2015-ben és a régebbi verziókban
A menüsávon válassza a Fájl>Új>Projekt lehetőséget.
Az Új projekt párbeszédpanel bal oldali ablaktábláján bontsa ki a Telepített>sablonok elemet, és válassza a Visual C++ lehetőséget, majd a középső panelen válassza a Win32 Konzolalkalmazás lehetőséget. Írja be a MathLibrary nevet a Névszerkesztés mezőbe a projekt nevének megadásához. Hagyja meg az alapértelmezett Hely és megoldás névértékeket . A Megoldás beállítása új megoldás létrehozásához. Ha nincs bejelölve, jelölje be a Megoldáshoz könyvtár létrehozása opciót.
Az OK gombra kattintva zárja be az Új projekt párbeszédpanelt, és indítsa el a Win32 Alkalmazás varázslót.
Válassza a Tovább gombot. Az Alkalmazásbeállítások lap Alkalmazástípus területén válassza a DLL elemet.
A projekt létrehozásához válassza a Befejezés gombot.
Amikor a varázsló befejezi a megoldást, a létrehozott projekt- és forrásfájlok megjelennek a Visual Studio Megoldáskezelő ablakában.
Ez a DLL jelenleg nem igazán működik. Ezután létre fog hozni egy fejlécfájlt, amely deklarálja a DLL által exportált függvényeket, majd hozzáadja a függvénydefiníciókat a DLL-hez, hogy még hasznosabb legyen.
Fejlécfájl hozzáadása a DLL-hez
Ha fejlécfájlt szeretne létrehozni a függvényekhez, a menüsávon válassza a ProjectAdd New Item (Új elem hozzáadása> lehetőséget.
Az Új elem hozzáadása párbeszédpanel bal oldali ablaktábláján válassza a Visual C++ lehetőséget. A középső panelen válassza a Fejlécfájl (.h) lehetőséget. Adja meg
MathLibrary.ha fejlécfájl nevét.
A Hozzáadás gombra kattintva létrehoz egy üres fejlécfájlt, amely egy új szerkesztőablakban jelenik meg.
Cserélje le a fejlécfájl tartalmát a következő kódra:
// 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();
Ez a fejlécfájl deklarál néhány függvényt egy általánosított Fibonacci-sorozat létrehozásához két kezdeti érték alapján. Egy fibonacci_init(1, 1) hívás a jól ismert Fibonacci-számsorozatot generálja.
Figyelje meg az előfeldolgozási utasításokat a fájl tetején. A DLL-projekt új projektsablonja hozzáadja <PROJECTNAME>_EXPORTS a definiált előfeldolgozó makrókat. Ebben a példában a Visual Studio határozza meg MATHLIBRARY_EXPORTS , hogy mikor épül fel a MathLibrary DLL-projekt.
MATHLIBRARY_EXPORTS A makró definiálásakor a MATHLIBRARY_API makró beállítja a __declspec(dllexport) módosítót a függvénydeklarációkon. Ez a módosító arra utasítja a fordítót és a csatolót, hogy exportáljon egy függvényt vagy változót a DLL-ből más alkalmazások általi használatra. Ha MATHLIBRARY_EXPORTS nincs definiálva, például ha a fejlécfájlt egy ügyfélalkalmazás tartalmazza, MATHLIBRARY_API alkalmazza a __declspec(dllimport) módosítót a deklarációkra. Ez a módosító optimalizálja a függvény vagy változó importálását egy alkalmazásban. További információ: dllexport, dllimport.
Implementáció hozzáadása a DLL-hez
A Megoldáskezelőben kattintson a jobb gombbal a Forrásfájlok csomópontra, és válassza azÚj elem> lehetőséget. Hozzon létre egy új
.cpp, úgynevezettMathLibrary.cppfájlt úgy, ahogyan az előző lépésben hozzáadott egy új fejlécfájlt.A szerkesztőablakban jelölje ki a
MathLibrary.cpplapot, ha már meg van nyitva. Ha nem, a Megoldáskezelőben kattintsonMathLibrary.cppduplán a MathLibrary projekt Forrásfájlok mappájába a megnyitásához.A szerkesztőben cserélje le a
MathLibrary.cppfájl tartalmát a következő kódra:// 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_; }
A szerkesztőablakban jelölje ki a MathLibrary.cpp fülét, ha már meg van nyitva. Ha nem, a Megoldáskezelőben kattintson duplán a MathLibrary projekt Forrásfájlok mappájában található MathLibrary.cpp a megnyitásához.
A szerkesztőben cserélje le a
MathLibrary.cppfájl tartalmát a következő kódra:// 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_; }
Annak ellenőrzéséhez, hogy minden eddig működik-e, állítsa össze a DLL-t. Az összeállításhoz válassza a Build>Build Solution lehetőséget a menüsávon. A DLL és a kapcsolódó fordító kimenete közvetlenül a megoldás mappája alatt található Debug . Ha kiadási buildet hoz létre, a kimenet egy úgynevezett Releasemappába kerül. A kimenetnek valahogy így kell kinéznie:
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 ==========
Gratulálunk, létrehozott egy DLL-t a Visual Studióval! Ezután létrehoz egy ügyfélalkalmazást, amely a DLL által exportált függvényeket használja.
DLL-t használó ügyfélalkalmazás létrehozása
DLL létrehozásakor gondolja át, hogyan használhatják az ügyfélalkalmazások. A függvények meghívásához vagy a DLL által exportált adatok eléréséhez az ügyfél forráskódjának fordításkor rendelkezésre kell állnia a deklarációknak. Összekötéskor a linker információra van szüksége a függvényhívások vagy az adathozzáférések feloldásához. A DLL ezeket az információkat egy importálási kódtárban látja el, amely a függvények és adatok megkeresésére vonatkozó információkat tartalmazza a tényleges kód helyett. Futásidőben a DLL-nek elérhetőnek kell lennie az ügyfél számára egy olyan helyen, amelyet az operációs rendszer talál.
Akár saját, akár harmadik féltől származó, az ügyfélalkalmazás-projektnek több információra van szüksége a DLL használatához. Meg kell keresnie a DLL-exportálásokat deklaráló fejléceket, a hivatkozáshoz tartozó importálási kódtárakat és magát a DLL-t. Az egyik megoldás az összes fájl másolása az ügyfélprojektbe. Az olyan külső DLL-ek esetében, amelyek valószínűleg nem változnak, amíg az ügyfél fejlesztés alatt áll, ez a módszer lehet a legjobb módja a használatuknak. Ha azonban a DLL-t is létrehozza, érdemes elkerülni a duplikációt. Ha helyi másolatot készít a fejlesztés alatt álló DLL-fájlokról, előfordulhat, hogy véletlenül módosít egy fejlécfájlt az egyik példányban, a másikban nem, vagy elavult kódtárat használ.
A nem szinkronizált kód elkerülése érdekében javasoljuk, hogy állítsa be a belefoglalási útvonalat az ügyfélprojektben úgy, hogy a DLL-fejlécfájlokat közvetlenül a DLL-projektből tartalmazza. Állítsa be az ügyfélprojekt kódtár-elérési útját úgy is, hogy a DLL-projektből származó DLL-importálási kódtárakat is tartalmazza. Végül másolja a DLL-projektből a beépített DLL-t az ügyfél build kimeneti könyvtárába. Ez a lépés lehetővé teszi, hogy az ügyfélalkalmazás ugyanazt a DLL-kódot használja, amelyet létrehoz.
Ügyfélalkalmazás létrehozása a Visual Studióban
A menüsávOn válassza azÚj>projekt> lehetőséget az Új projekt létrehozása párbeszédpanel megnyitásához.
A párbeszédpanel tetején állítsa a Nyelvbeállítást C++-ra, állítsa a PlatformotWindowsra, és állítsa a Projekt típusátkonzolra.
A projekttípusok szűrt listájában válassza a Konzolalkalmazás lehetőséget, majd a Tovább gombot.
Az új projekt konfigurálása lapon írja be a MathClient kifejezést a Projekt név mezőjébe a projekt nevének megadásához. Hagyja meg az alapértelmezett Hely és megoldás névértékeket . A Megoldás beállítása új megoldás létrehozásához. Törölje a jelölést, ha be van jelölve a Megoldás és projekt elhelyezése ugyanabban a könyvtárban jelölőnégyzetet.
Válassza a Létrehozás gombot az ügyfélprojekt létrehozásához.
Számodra létrehoztunk egy minimális konzolalkalmazás-projektet. A fő forrásfájl neve megegyezik a korábban megadott projektnévvel. Ebben a példában a neve MathClient.cpp. Létrehozhatja, de még nem használja a DLL-t.
Ügyfélalkalmazás létrehozása a Visual Studio 2017-ben
A létrehozott DLL-t használó C++ alkalmazás létrehozásához a menüsávon válassza azÚj>projekt> lehetőséget.
Az Új projekt párbeszédpanel bal oldali ablaktábláján válassza a Windows Desktop lehetőséget a Telepített>vizualizáció C++ területén. A középső panelen válassza a Windows Konzolalkalmazás lehetőséget. Adja meg a projekt ( MathClient) nevét a Név szerkesztése mezőben. Hagyja meg az alapértelmezett Hely és megoldás névértékeket . A Megoldás beállítása új megoldás létrehozásához. Ha nincs bejelölve, jelölje be a Megoldáshoz könyvtár létrehozása opciót.
Válassza az OK gombot az ügyfélalkalmazás-projekt létrehozásához.
Számodra létrejött egy minimális konzolalkalmazás-projekt. A fő forrásfájl neve megegyezik a korábban megadott projektnévvel. Ebben a példában a neve MathClient.cpp. Létrehozhatja, de még nem használja a DLL-t.
Ügyfélalkalmazás létrehozása a Visual Studio 2015-ben
A létrehozott DLL-t használó C++ alkalmazás létrehozásához a menüsávon válassza azÚj>projekt> lehetőséget.
Az Új projekt párbeszédpanel bal oldali ablaktábláján válassza a Win32 lehetőséget a Telepített>sablonok>Vizualizáció C++ területén. A középső panelen válassza a Win32 Konzolalkalmazás lehetőséget. Adja meg a projekt ( MathClient) nevét a Név szerkesztése mezőben. Hagyja meg az alapértelmezett Hely és megoldás névértékeket . A Megoldás beállítása új megoldás létrehozásához. Ha nincs bejelölve, jelölje be a Megoldáshoz könyvtár létrehozása opciót.
Az OK gombra kattintva zárja be az Új projekt párbeszédpanelt, és indítsa el a Win32 Alkalmazás varázslót. A Win32 alkalmazásvarázsló párbeszédpanel Áttekintés lapján válassza a Tovább gombot.
Ha még nincs kiválasztva, válassza az Alkalmazásbeállítások lap Alkalmazástípus területén a Konzolalkalmazás lehetőséget.
A projekt létrehozásához válassza a Befejezés gombot.
Amikor a varázsló futásának vége, létrejön egy minimális konzolalkalmazás-projekt. A fő forrásfájl neve megegyezik a korábban megadott projektnévvel. Ebben a példában a neve MathClient.cpp. Létrehozhatja, de még nem használja a DLL-t.
A Következő lépésben a MathLibrary függvények forráskódban való meghívásához a projektnek tartalmaznia kell a MathLibrary.h fájlt. Ezt a fejlécfájlt átmásolhatja az ügyfélalkalmazás-projektbe, majd meglévő elemként hozzáadhatja a projekthez. Ez a módszer jó választás lehet külső kódtárakhoz. Ha azonban egyszerre dolgozik a DLL és az ügyfél kódján, a fejlécfájlok nem lesznek szinkronizálva. A probléma elkerülése érdekében állítsa be a projekt további belefoglalási könyvtárainak elérési útját úgy, hogy az tartalmazza az eredeti fejléc elérési útját.
A DLL-fejléc hozzáadása a belefoglalási útvonalhoz
A Tulajdonságlapok párbeszédpanel megnyitásához kattintson a jobb gombbal a MathClient csomópontra a Megoldáskezelőben.
A Konfiguráció legördülő listában válassza a Minden konfiguráció lehetőséget , ha még nincs kijelölve.
A bal oldali panelen válassza a Konfigurációs tulajdonságok>> lehetőséget.
A tulajdonságpanelen válassza a További belefoglalás könyvtárak szerkesztési mező melletti legördülő vezérlőt, majd válassza a Szerkesztés lehetőséget.
A szerkesztési vezérlő engedélyezéséhez kattintson duplán a További belefoglalás könyvtárak párbeszédpanel felső ablaktáblájára. Vagy a mappaikont választva új bejegyzést hozhat létre.
A szerkesztési vezérlőben adja meg a fejlécfájl helyének
MathLibrary.helérési útját. Az ellipszis (...) vezérlőre kattintva választhatja ki a megfelelő mappát.Megadhat egy relatív elérési utat is az ügyfél forrásfájljaitól a DLL-fejlécfájlokat tartalmazó mappáig. Ha követte azokat az utasításokat, amelyekkel az ügyfélprojektet a DLL-től eltérő megoldásba helyezheti, a relatív elérési útnak a következőképpen kell kinéznie:
..\..\MathLibrary\MathLibraryHa a DLL- és ügyfélprojektek ugyanabban a megoldásban találhatók, a relatív elérési út a következőképpen nézhet ki:
..\MathLibraryHa a DLL és az ügyfélprojektek más mappákban találhatók, igazítsa a relatív elérési utat a megfelelő módon. Vagy a három pont vezérlőelem használatával keresse meg a mappát.
Miután megadta a fejlécfájl elérési útját a További belefoglalás könyvtárak párbeszédpanelen, kattintson az OK gombra. A Tulajdonságok lapjai párbeszédpanelen kattintson az OK gombra a módosítások mentéséhez.
Mostantól hozzáadhatja a MathLibrary.h fájlt, és használhatja a kliensalkalmazásában deklarált függvényeket. Cserélje le a MathClient.cpp tartalmát a következő kód használatával:
// 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;
}
Ez a kód lefordítható, de nem csatolható. Ha most hozza létre az ügyfélalkalmazást, a hibalista számos LNK2019 hibát jelenít meg. Ennek az az oka, hogy a projektből hiányzik néhány információ: Még nem adta meg, hogy a projekt függőségben van-e a MathLibrary.lib tártól. És még nem mondta el a linkernek, hogy keresse meg a MathLibrary.lib fájlt.
A probléma megoldásához a tárfájlt közvetlenül az ügyfélalkalmazás-projektbe másolhatja. A linker automatikusan megkeresi és használja. Ha azonban a kódtár és az ügyfélalkalmazás is fejlesztés alatt áll, az az egyik példányban olyan változásokhoz vezethet, amelyek nem jelennek meg a másikban. A probléma elkerülése érdekében beállíthatja a További függőségek tulajdonságot, hogy közölje a buildelési rendszerrel, hogy a projekt függ a MathLibrary.libprojekttől. Emellett beállíthat egy további könyvtárkönyvtárak elérési utat a projektben úgy, hogy a hivatkozáskor szerepeljen az eredeti tár elérési útja.
A DLL-importálási kódtár hozzáadása a projekthez
Kattintson a jobb gombbal a MathClient csomópontra a Megoldáskezelőben , és válassza a Tulajdonságok lehetőséget a Tulajdonságlapok párbeszédpanel megnyitásához.
A Konfiguráció legördülő listában válassza a Minden konfiguráció lehetőséget , ha még nincs kijelölve. Biztosítja, hogy a tulajdonságmódosítások a hibakeresési és a kiadási buildekre is vonatkozzanak.
A bal oldali panelen válassza a Konfiguráció tulajdonságai, >Linker és >Bemenet lehetőséget. A tulajdonságpanelen válassza a További függőségek szerkesztési mező melletti legördülő vezérlőt, majd válassza a Szerkesztés lehetőséget.
A További függőségek párbeszédpanelen adja hozzá
MathLibrary.liba listához a felső szerkesztési vezérlőben.
Az OK gombra kattintva lépjen vissza a Tulajdonságlapok párbeszédpanelre.
A bal oldali panelen válassza a Configuration Properties>Linker>General lehetőséget. A tulajdonságpanelen válassza a További könyvtárkönyvtárak szerkesztési mező melletti legördülő vezérlőt, majd válassza a Szerkesztés lehetőséget.
A szerkesztési vezérlő engedélyezéséhez kattintson duplán a További könyvtárkönyvtárak párbeszédpanel felső ablaktáblájára. A szerkesztési vezérlőben adja meg a
MathLibrary.libfájl helyének elérési útját. Alapértelmezés szerint egy Hibakeresés nevű mappában található, közvetlenül a DLL-megoldás mappája alatt. Ha kiadási buildet hoz létre, a fájl egy Kiadás nevű mappába kerül. Használhatja a makrót$(IntDir), hogy a linker megtalálja a DLL-t, függetlenül attól, hogy milyen buildet hoz létre. Ha követte azokat az utasításokat, amelyekkel az ügyfélprojektet a DLL-projekttől eltérő megoldásba helyezheti, a relatív elérési útnak a következőképpen kell kinéznie:..\..\MathLibrary\$(IntDir)Ha a DLL- és ügyfélprojektek más helyeken találhatók, módosítsa a relatív elérési utat.
Miután megadta a tárfájl elérési útját a További tárkönyvtárak párbeszédpanelen, az OK gombra kattintva lépjen vissza a Tulajdonságlapok párbeszédpanelre. A tulajdonság módosításainak mentéséhez kattintson az OK gombra .
Az ügyfélalkalmazás most már sikeresen lefordítható és összekapcsolható, de még mindig nem rendelkezik mindazzal, ami a futtatásához szükséges. Amikor az operációs rendszer betölti az alkalmazást, a MathLibrary DLL-t keresi. Ha nem találja a DLL-t bizonyos rendszerkönyvtárakban, a környezeti útvonalban vagy a helyi alkalmazáskönyvtárban, a terhelés meghiúsul. Az operációs rendszertől függően a következőhöz hasonló hibaüzenet jelenik meg:
A probléma elkerülésének egyik módja az, ha a DLL-t a build folyamat részeként abba a könyvtárba másolja, ahol az ügyfél végrehajtható fájl található. Hozzáadhat egy build utáni eseményt a projekthez, és hozzáadhat egy parancsot, amely átmásolja a DLL-t a build kimeneti könyvtárába. Az itt megadott parancs csak akkor másolja át a DLL-t, ha az hiányzik vagy megváltozott. Makrókat használ a hibakeresési vagy kiadási helyekre és onnan való másoláshoz, a build-konfiguráció alapján.
A DLL másolása a buildelés utáni eseményben
Kattintson a jobb gombbal a MathClient csomópontra a Megoldáskezelőben , és válassza a Tulajdonságok lehetőséget a Tulajdonságlapok párbeszédpanel megnyitásához.
A Konfiguráció legördülő listában válassza a Minden konfiguráció lehetőséget , ha még nincs kijelölve.
A bal oldali panelen válassza a Konfiguráció tulajdonságai>Build események>Lefordítás utáni esemény lehetőséget.
A tulajdonságpanelen válassza ki a szerkesztési vezérlőt a Parancssor mezőben. Ha követte azokat az utasításokat, amelyekkel az ügyfélprojektet a DLL-projekttől eltérő megoldásba helyezheti, írja be ezt a parancsot:
xcopy /y /d "..\..\MathLibrary\$(IntDir)MathLibrary.dll" "$(OutDir)"Ha a DLL- és ügyfélprojektek más könyvtárakban találhatók, módosítsa a DLL relatív elérési útját úgy, hogy megegyezzon.
Kattintson az OK gombra a projekttulajdonságok módosításainak mentéséhez.
Az ügyfélalkalmazás most már mindennel rendelkezik, amire szüksége van a buildeléshez és a futtatáshoz. Az alkalmazás létrehozásához válassza a Build>Build Solution lehetőséget a menüsávon. A Visual Studio Kimeneti ablakának a Visual Studio verziójától függően az alábbi példához hasonlónak kell lennie:
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 ==========
Gratulálunk, létrehozott egy alkalmazást, amely függvényeket hív meg a DLL-ben. Most futtassa az alkalmazást, hogy lássa, mit csinál. A menüsávon válassza a Hibakeresés>Indítás hibakeresés nélkül. A Visual Studio megnyitja a program futtatásához szükséges parancsablakot. A kimenet utolsó részének a következőképpen kell kinéznie:
A parancsablak bezárásához nyomja le bármelyik billentyűt.
Most, hogy létrehozott egy DLL-t és egy ügyfélalkalmazást, kísérletezhet. Próbáljon töréspontokat beállítani az ügyfélalkalmazás kódjában, és futtassa az alkalmazást a hibakeresőben. Nézze meg, mi történik, ha belép egy könyvtárhívásba. Adjon hozzá más függvényeket a tárhoz, vagy írjon egy másik ügyfélalkalmazást, amely a DLL-t használja.
Az alkalmazás üzembe helyezésekor az általa használt DLL-eket is üzembe kell helyeznie. A legegyszerűbben úgy teheti elérhetővé a buildelt VAGY harmadik felektől származó DLL-eket, ha ugyanabba a könyvtárba helyezi őket, mint az alkalmazás. Ezt alkalmazás-helyi üzembe helyezésnek nevezzük. Az üzembe helyezéssel kapcsolatos további információkért lásd: Üzembe helyezés a Microsoft C++-ban.