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. Az útmutató ismerteti ezeket a bővítményeket útközben.
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 használjon C stílusú interfészeket. Ennek a választásnak 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
- Windows 7 vagy újabb. A legjobb fejlesztési élmény érdekében használja a Windows legújabb verzióját.
Visual Studio. 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. Ha nem telepítette ezt a számítási feladatot Visual Studio telepítésekor, ne aggódjon. A telepítőt újra futtathatja, és most telepítheti.
- Visual Studio. 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 Windows asztali alkalmazásokat használt, akkor 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ódjon, az útmutató nem fed le túl bonyolult dolgokat.
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>fájl>Project lehetőséget az Új Project 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 válassza a Tovább lehetőséget.
Ha nem látja ezt a típust, győződjön meg arról, hogy telepítve van a C++ asztali fejlesztése , az előfeltételekben leírtak szerint.
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 kattintson a Létrehozás gombra.
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>fájl>Project lehetőséget az Új Project párbeszédpanel megnyitásához.
Az Új Project párbeszédpanel bal oldali ablaktábláján válassza a Telepített>Visual C++>Windows Asztal 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>Projektlehetőséget.
Az Új Project 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. A középső panelen válassza a Win32 Konzolalkalmazás lehetőséget. Adja meg a MathLibrary nevet a projekt neveként . Ne módosítsa 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. Válassza a Megoldás könyvtárának létrehozása lehetőséget.
Az OK gombra kattintva zárja be az Új Project párbeszédpanelt, és indítsa el a Win32 alkalmazásvará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 lehetőséget.
Amikor a varázsló befejezi a megoldást, láthatja a létrehozott projekt- és forrásfájlokat a Megoldáskezelő ablakban Visual Studio.
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, válassza a menüsáv Project>Ú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ő 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, névvel ellátottMathLibrary.cppfájlt, 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. A fordításhoz a menüsávon válassza a Build>Build Solution parancsot. 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 Studio használatával! Ezután létrehoz egy ügyfélalkalmazást, amely a DLL-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 állítsa be az ügyfélprojekt belefoglalási útvonalát úgy, hogy az közvetlenül a DLL-projektből tartalmazza a DLL-fejlécfájlokat. Á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>fájl>Project lehetőséget az Új project 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 , majd a Tovább lehetőséget.
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>fájl>Project lehetőséget.
Az Új projekt párbeszédpanel bal oldali ablaktáblájában válassza a(z) Windows Desktop lehetőséget a Installed> Visual C++ alatt. A középső panelen válassza a Windows Konzolalkalmazás lehetőséget. Írja be a MathClient nevet a Név mezőbe. Tartsa meg az alapértelmezett hely - és megoldásné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.
Válassza az OK gombot az ügyfélalkalmazás-projekt 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 2015-ben
A létrehozott DLL-t használó C++ alkalmazás létrehozásához a menüsávon válassza azÚj>fájl>Project 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. Jelölje be a Megoldás számára címtár létrehozása lehetőséget, ha nincs bejelölve.
Az OK gombra kattintva zárja be az Új Project 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 lehetőséget.
Amikor a varázsló befejeződik, létrehoz 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.
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 Megoldáskezelő.
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 válassza a mappa ikont új bejegyzés létrehozásához.
A szerkesztési vezérlőben adja meg a fejlécfájl helyének
MathLibrary.helérési útját. A három pontra (...) kattintva keresse meg 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ási könyvtárak párbeszédpanelen, válassza az OK gombot. 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 nem mondta el a linkernek, hogyan 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, ez a művelet az egyik példány olyan módosításaihoz vezethet, amelyek nem jelennek meg a másikban. A probléma elkerülése érdekében állítsa be 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. És adjon meg egy További könyvtárak elérési utat a projektjében, hogy a csatoláskor felvegye az eredeti könyvtár elérési útját.
A DLL-importálási kódtár hozzáadása a projekthez
Kattintson a jobb gombbal a MathClient csomópontra Megoldáskezelő, é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. Ez a kijelölés biztosítja, hogy a tulajdonságmódosítások a Hibakeresés és a Kiadás 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. Kattintson az OK gombra a tulajdonság módosításainak mentéséhez.
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, ha a DLL-t a buildfolyamat részeként abba a könyvtárba másolja, amely az ügyfélprogram futtatható állományát tartalmazza. 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 módosult. 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 Megoldáskezelő, é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 lefordításához válassza a menüsoron a Build>Build Solution lehetőséget. A Visual Studio Kimenet ablaka az alábbi példához hasonlót mutat a Visual Studio verziójától függően:
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 ==========
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üsorban válassza a Hibakeresés>Hibakeresés nélkül indítás lehetőséget. A Visual Studio megnyitja a program futtatásához szükséges parancsablakot. A kimenet utolsó része a következőképpen néz ki:
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 a megközelítést 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.