A kötés típusai
Eddig sok API-funkciót használtunk ablakok és ablakok létrehozásához, rajzoláshoz, billentyűzethez és egérhez, valamint input / outputhoz. Mindezek a funkciók jól működtek, és nem gondoltál arra a kérdésre, hogy hol találhatók ezek a funkciók és hogyan kapcsolódnak össze a programjához. Mindössze annyit kellett tennie, hogy csatlakoztassa a megfelelő fejléc fájlt (leggyakrabban
Kezdjük azzal, hogy figyelembe vesszük a programban meghatározott funkció használatának leggyakoribb mechanizmusát. Például létrehoz egy faktoriális számítási programot és definiál egy függvényt a program belsejében, amely közvetlenül kiszámítja ezt a faktoriát:
// A faktoriális számítás funkciója
int NFaktoriális (int N)
máshová vissza NFactorial (N-1) * N;
Így a funkció közvetlenül a program szövegében található. A fenti program összeállítása a következő sémával jeleníthető meg:
Factorial.cpp fájl factorial.obj fájl factorial.exe fájl
12.12. Ábra Az első típusú statikus kötéssel rendelkező program összeállítása
A második típus statikus kötése magában foglalja a programban lévő egyéb fájlokban (könyvtárakban) meghatározott funkciókat. A könyvtárfájlok általában * .lib kiterjesztéssel rendelkeznek, és a futtatható fájlhoz (* .exe) kapcsolódnak csak a fordítási és összekapcsolási szakaszban (2. Így nem fordítanak újra, az objektum kódjuk (a * .obj fájl analógja) már létezik, és összeállítható a fájlba (* .obj) fordítási időben. Az egyetlen dolog, amit meg kell tenni, hogy csatlakoztassa a kívánt fájl-fejlécet (* .h) a program szövegéhez.
Factorial.cpp fájl factorial.obj fájl factorial.exe fájl
12.2. Ábra: A második típusú statikus kapcsolattal rendelkező program összeállítása
Végül dinamikusan kapcsolt könyvtárakat (* .dll) is használhat. A funkciók csak a hívás pillanatában kapcsolódnak a végrehajtható fájlhoz (* .exe), vagyis abban az esetben, amikor a program fut és elérte a megadott funkciót. Így a funkció nem fordul össze a programjával, nem vesz részt a kötelező folyamatban, és nem szerepel a * .exe fájlban. Ennek a megközelítésnek tagadhatatlan előnyei vannak:
1. A gyakran használt funkciókat külön fájlok tárolják. Például az összes API-funkciót a DLL telepíti és szállítja az operációs rendszerrel. Így a Windows összes programja ugyanazokat a funkciókat használhatja.
2. Nincs szükség a program összes funkciójának * .exe fájlba való beillesztésére. Szükség szerint betölthetők.
3. A funkciók új verzióinak (dll-fájlok) használata a végrehajtható modulok (exe-fájlok) újrafordítása nélkül.
Tekintsük a DLL készítésének és használatának folyamatát.
A dinamikus könyvtár létrehozásának folyamata két szakaszban zajlik le. Az első olyan fejlécfájl (* .h) létrehozása, amely meghatározza a projekt fő tulajdonságait.
A Microsoft Visual C ++ környezet "varázslója" segítségével hozzon létre egy új projektet, ha a Dinamikus Linkelt Könyvtárat választja a projekt típusának. majd adja meg az "üres projektet" (üres projekt). Most meg kell hoznia magának a projektfájlokat. A projekt neve legyen funlib.
Hozzon létre egy fejlécfájlt - funlib.h (a Fájl \ Új menü segítségével, kiválasztva a fejlécfájlt). Ebben a fájlban egyesítse a következő szöveget:
#define EXPORT extern "C" __declspec (dllexport)
EXPORT BOOL CALLBACK return333 ();
EXPORT int CALLBACK MyInc (int i);
Most csak a * .cpp program egyszerű szövegét írja le, amely kevéssé különbözik a megszokottól:
int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)