Tipuri de legare

Până acum, am folosit mai multe funcții API pentru a crea ferestre și proceduri de fereastră, desen, tastatură și mouse și intrare / ieșire. Toate aceste funcții au funcționat bine și nu v-ați gândit la întrebarea: unde sunt localizate aceste funcții și cum se conectează la programul dvs. Tot ce trebuia să faceți a fost să conectați fișierul antet corespunzător (cel mai adesea a fost ) și apelați funcția dorită. Toate celelalte acțiuni pentru a include funcția în programul dvs. mediul de programare s-au efectuat automat. Acum este momentul să examinați mecanismele care permit utilizarea funcțiilor.

Să începem prin luarea în considerare a mecanismului cel mai comun pentru utilizarea funcției definite în programul dvs. De exemplu, creați un program de calcul factorial și definiți o funcție din interiorul programului care calculează direct acest factorial:

// Funcția de calcul al factorială

int NFactorial (int N)

altfel returnează NFactorial (N-1) * N;

Astfel, funcția dvs. este localizată chiar în textul programului. Procesul de compilare pentru programul de mai sus poate fi afișat cu următoarea schemă:

Fișier Factorial.cpp factorial.obj fișier factorial.exe

Tipuri de legare

Fig.12.1 Compilarea unui program cu o legare statică a primului tip

Legarea statică a celui de-al doilea tip implică utilizarea funcțiilor definite în alte fișiere (biblioteci) din programul dvs. Fișierele de fișiere de bibliotecă au de obicei extensie * .lib și sunt conectate la fișierul executabil (* .exe) numai la etapa de compilare și conectare (figura 2). Astfel, acestea nu sunt compilate din nou, codul lor obiect (un analog al fișierului * .obj) există deja și va fi compilat în fișierul dvs. (* .obj) la momentul compilării. Singurul lucru care trebuie făcut este să conectați fișierul antet (* .h) dorit la textul programului.

Fișier Factorial.cpp factorial.obj fișier factorial.exe

Figura 12.2 Compilarea unui program cu o legătură statică de tipul celui de-al doilea

Și, în sfârșit, puteți utiliza biblioteci legate dinamic (* .dll). Funcțiile conținute în ele sunt conectate la fișierul executabil (* .exe) numai la momentul apelului, adică în momentul în care programul rulează și care accesează funcția specificată. Astfel, funcția nu se compilează cu programul dvs., nu participă la procesul de legare și nu este inclusă în fișierul * .exe. Această abordare are avantaje incontestabile:

1. Funcțiile utilizate frecvent sunt stocate în fișiere separate. De exemplu, toate funcțiile API sunt implementate în DLL și livrate împreună cu sistemul de operare. Astfel, toate programele de pe Windows pot folosi aceleași funcții.

2. Nu este nevoie să puneți toate funcțiile programului în fișierul * .exe. Ele pot fi încărcate după cum este necesar.

3. Posibilitatea de a folosi noi versiuni de funcții (dll-files) fără a recompila modulele executabile (fișiere exe).

Luați în considerare procesul de creare și utilizare a DLL-urilor.

Procesul de creare a unei biblioteci dinamice are loc în două etape. Primul este crearea unui fișier antet (* .h), care definește proprietățile principale ale proiectului.

Folosind "wizard" din mediul Microsoft Visual C ++, creați un nou proiect prin selectarea Bibliotecii Linked Dinamic ca tip de proiect. apoi definiți "proiectul gol" (proiect gol). Acum trebuie să creați singur fișierele proiectului. Permiteți-vă numele proiectului dvs. să fie funlib.

Creați un fișier antet - funlib.h (utilizând meniul Fișier \ Nou, selectând fișierul antet). În acest fișier, îmbinați următorul text:

#define EXPORT extern "C" __declspec (dllexport)

CALLBACK EXPORT BOOL return333 ();

EXPORT int CALLBACK MyInc (int i);

Acum rămâne să scrieți textul simplu al programului * .cpp, care diferă puțin de cel obișnuit:

int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)

Articole similare