Crearea și utilizarea bibliotecilor legate în mod dinamic (dll)

Crearea și utilizarea unui DLL
(Microsoft Visual C ++)

Crearea unui DLL este mult mai ușor decât crezi. DLL-urile sunt foarte utile dacă programați în Windows. Aceste biblioteci stochează de obicei rutine utilizate frecvent. Articolul descrie cum se creează un DLL simplu și arată modul de a apela funcțiile conținute în el. Exemplele sunt concepute pentru a utiliza Microsoft Visual C ++ 6.0, dar este ușor să le traducem în orice dialect C ++.

Crearea unui DLL

Nimic special aici. Ca de obicei, scrieți doar funcții, ca într-un program obișnuit. Dacă utilizați MSVC, creați un nou proiect și specificați că creați Win32 Dynamic-Link Library. După compilare, veți obține un DLL, o bibliotecă de import (.lib) și o bibliotecă de export (.exp). Următoarele reprezintă un exemplu de cod DLL:

Fișierul de antet (DLLTEST.H)

#ifndef _DLLTEST_H_
#define _DLLTEST_H_

#include
#include
#include

extern "C" __declspec (dllexport) void NumberList ();
extern "C" __declspec (dllexport) void LetterList ();

Codul bibliotecii (DLLTEST.CPP)

#define MAXMODULE 50

extern "C" __declspec (dllexport) void NumberList ()
GetModuleFileName (modul NULL, (LPTSTR), MAXMODULE);
cout <<"\n\nThis function was called from "
< < cout <<"NumberList(): ";
pentru (int i = 0; i<10; i++)
cout <>
cout <>

extern "C" __declspec (dllexport) void LetterList ()
GetModuleFileName (modul NULL, (LPTSTR), MAXMODULE);
cout <<"\n\nThis function was called from "
< < cout <<"LetterList(): ";
pentru (int i = 0; i<26; i++)
cout <>
cout <>

După cum puteți vedea, nu există nimic special în legătură cu codul. Aplicația folosită pentru exemplu este consola, deci aici două funcții pe care textul de ieșire este pur și simplu programat. rând

extern "C" __declspec (dllexport)

înseamnă că funcția va fi vizibilă în afara DLL (adică poate fi apelată din programul nostru).
După compilare vom primi biblioteca. Acum, să vedem cum poate fi folosit.

Utilizarea DLL (cu bibliotecă de import)

Mai întâi, să vedem cum să folosim DLL-ul împreună cu biblioteca de import (dlltest.lib), obținută prin compilarea exemplului anterior. Această metodă este foarte simplă, deoarece în acest caz trebuie doar să includeți fișierul antetului bibliotecii și biblioteca însăși în proiect. exemplu:

Fișierul sursă pentru aplicația care utilizează DLL (DLLRUN01.EXE)

#include
#include

void main ()
NumărList ();
LetterList ();

Acest lucru va funcționa bine dacă aveți un fișier antet și biblioteca de import (dlltest.lib) este situat în directorul indicat de căile de bibliotecă. Înainte de a rula aplicația, asigurați-vă că DLL este într-un director de referință de variabila de mediu PATH sau în același director ca și fișierul executabil, sau primiți un mesaj de eroare. Cu toate acestea, în cazul în care 10 programe folosesc acest DLL, aveți nevoie doar de o copie a acestuia, situată, de exemplu, în directorul Windows \ System.

Rezultatele DLLRUN01.EXE

Această funcție a fost apelată din C: \ DLLTEST \ DLLRUN01.EXE
Număr de numere (): 0 1 2 3 4 5 6 7 8 9

Această funcție a fost apelată din C: \ DLLTEST \ DLLRUN01.EXE
LetterList (): a b c d e f g h i j k l m n o p q r s t u v w x y z

Utilizarea DLL fără bibliotecă de import

Acum, să vedem cum să încărcați DLL-ul "în zbor". Acest lucru este necesar în cazul în care nu ați dezvoltat acest DLL și nu aveți un fișier antet și o bibliotecă de import.

Fișierul sursă pentru aplicația care utilizează biblioteca DLL este aplicația consolei Win32 (DLLRUN01.EXE)

#include
#include
#include
#include

#define MAXMODULE 50

typedef void (WINAPI * cfunc) ();

cfunc NumberList;
cfunc LetterList;

void main ()
HINSTANCE hLib = LoadLibrary ("DLLTEST.DLL");
dacă (hLib == NULL)
cout <<"Unable to load library!" < getch ();
return;
>

GetModuleFileName ((HMODULE) Hlib, (LPTSTR) mod, MAXMODULE);
cout <<"Library loaded: " < NumărList = (cfunc) GetProcAddress ((HMODULE) hLib, "NumărList");
LetterList = (cfunc) GetProcAddress ((HMODULE) hLib, "LetterList");
dacă ((NumberList == NULL) || (LetterList == NULL))
cout <<"Unable to load function(s)." < FreeLibrary ((HMODULE) hLib);
return;
>
NumărList ();
LetterList ();
FreeLibrary ((HMODULE) hLib);
getch ();
>

Rezultatele DLLRUN02.EXE

Biblioteca încărcată: C: \ DLLTEST \ DLLTEST.DLL

Această funcție a fost apelată din C: \ DLLTEST \ DLLRUN02.EXE
Număr de numere (): 0 1 2 3 4 5 6 7 8 9

Această funcție a fost apelată din C: \ DLLTEST \ DLLRUN02.EXE
LetterList (): a b c d e f g h i j k l m n o p q r s t u v w x y z

concluzie

Desigur, aceste mici exemple sunt departe de sarcinile reale ale programatorului, însă sunt destul de suficiente pentru a înțelege principiile de bază ale creării și utilizării DLL-urilor. Scrieți dacă găsiți erori sau inexactități. Descărcați codul sursă al programelor utilizate în articol, puteți de aici.

Articole similare