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 ) és hívja a kívánt funkciót. Az összes többi művelet, amely a funkciót a programba beépítette a programozási környezetbe, automatikusan megtörtént. Itt az ideje, hogy áttekintsük azokat a mechanizmusokat, amelyek lehetővé teszik a funkciók használatát.

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

A kötés típusai

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)

Kapcsolódó cikkek