Proiect Programarea Calculatoarelor Și Limbaje de Programare 3
3. biblioteci de programare
description
Transcript of 3. biblioteci de programare
BIBLIOTECI DE PROGRAMARE
Mihail Croitor
Cuprins
Ce se numește biblioteca de programare Tipuri bibliotecilor de programare Structura bibliotecilor de programare Particularitățile bibliotecilor de programare Recomandări
Elaborarea bibliotecilor de programare Biblioteci statice Biblioteci dinamice
Utilizarea bibliotecilor de programare Legarea in mod implicit Legarea in mod explicit
Biblioteci de programare
Biblioteci de programare sunt arhive ale resurselor de programare, cum ar fi: funcții, clase, obiecte, constante și diferite variabile. Ca constante în biblioteci pot fi definite și datele grafice sau multimedia.
Tipuri bibliotecilor de programare
Biblioteci statice La etapa de compilare în aplicația se adaugă fragmente
de cod-obiect din biblioteca, care reprezint funcții (clase sau alte resurse) utilizate.
Biblioteci dinamice La etapa de compilare în aplicația se includ numai
apelurile funcțiilor (sau referințe la resurse) din biblioteca dinamică.
Structura bibliotecilor de programare
Fișier antet
Bibliotecastatică
Fișier antet
Bibliotecade import
Bibliotecadinamică
Biblioteci statice Biblioteci dinamice
*.h
*.lib (*.a)
*.h
*.lib (*.a)
*.dll (*.so)
Particularitățilebibliotecilor de programare
În program rezultant se adaugă numai codul funcțiilor utilizate.
Programul nu depinde de existența bibliotecilor în SO.
Ocupă mai puțină memorie operativă (relativ).
Volumul programului este mai mare (relativ).
Dacă biblioteca a fost schimbată, se cere recompilarea programului.
Independent de numarul funcțiilor utilizate, programul încarcă in memoria operativă DLL în întregime.
Mai multe programe pot lucra concomitent cu o bibliotecă dll.
Volumul programului este mai mic (relativ)
Este necesară existența bibliotecii dll în SO.
După reînniorea bibliotecii dll recompilarea programului nu este necesară.
Biblioteci statice Biblioteci dinamice
Recomandări
Dacă o bibliotecă nu este standardă sau este rară, mai bine de utilizat legarea statică.
Dacă biblioteca este standardă sau una larg utilizată, atunci se recomandă utilizarea legării dinamice.
Se recomandă crearea ambelor versiuni ale bibliotecii: versiunea dinamică și statică.
Elaborarea bibliotecilor de programare
Proces de eleborare bibliotecilor seamănă cuelaborareaaplicațiilorobișnuite
Biblioteci statice: fișiere-antet
#ifndef _GEOMETRY_H_#define _GEOMETRY_H_
struct point{ double x, y;
point(); point(double, double);};
struct line{ double a, b, c;
line(); line(double, double, double);};
#endif
Fisiere-antet trebuie protejate de includerea repetată cu ajutorul directivelor preprocesorului:#ifndef A_CONSTANT#define A_CONSTANT
#endif
Microsoft VC++ (+ Intel Compiler) permite utilizarea directivei#pragma once
Biblioteci statice: codul-sursă
#include "geometry.h"
point::point(): x(0), y(0) {}
point::point(double p1, double p2)
: x(p1), y(p2) {}
line::line(): a(0), b(0), c(0) {}
line::line(double p1, double p2, double p3)
: a(p1), b(p2), c(p3) {}
Codul sursă se scrie în mod obișnuit
Biblioteci dinamice: fișier-antet
#ifndef _GEOMETRY_H_#define _GEOMETRY_H_#define DLLEXPORT __declspec(dllexport)
struct DLLEXPORT point{ double x, y; point(); point(double, double);};
struct DLLEXPORT line{ double a, b, c; line(); line(double, double, double); bool contains(const point&) const;};
DLLEXPORT bool contains(const line&, const point&);#endif
Se adaugă o indicație (un macrou) pentru exportulstructurilor și funcțiilor
Cpp fișiere nu se modifică
Biblioteci dinamice: fișiere de definiție a modulelor
Fișiere cu extensia .DEF se utilizează pentru definirea funcțiilor exportate de biblioteca (este o alternativă pentru __declspec(dllexport) )
MODULE mylibEXPORTS
min @1isPrime @2nope @3 ; no operation
Biblioteci dinamice: punctul de întrare
În biblioteca dinamică poate fi definit punct de întrare (se utilizează windows.h).
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ switch (ul_reason_for_call){ case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE;}
Utilizarea bibliotecilor de programare
Legarea statică Legarea dinamică implicită Legarea dinamică explicită
Modul de realizare a legării statice coincide cu modul de realizare a legării dinamice implicite.
Legare statică
geometry.h
geometry.lib
Copiați fișierul antet în mapa include, biblioteca în lib
Utilizare bibliotecii în proiect
1. Indicați calea relativă/absolută pâna la fișierul antet.
2. Indicați în proprietățile proiectului calea până la biblioteca
Legarea bibliotecii cu ajutorul unui macrou
#include "../geometry/geometry.h"
#pragma comment(lib, "../Debug/Geometry.lib")
#include <iostream>
int main(){ plane::point p(1, 0), p2(1, 2); //plane::line l(1, -1, 0);
//std::cout << l.contains(p); std::cout << "distance from " << p << " and " << p2 << " is "
<< plane::distance(p, p2) << std::endl; return 0;}
Legare explicită
Windows.h HMODULE WINAPI LoadLibrary(LPCTSTR
lpFileName); BOOL WINAPI FreeLibrary(HMODULE hModule); FARPROC WINAPI GetProcAddress(HMODULE
hModule, LPCSTR lpProcName);
Legarea explicită
#include <Windows.h>#include <iostream>
int main(){ HMODULE hMdl = LoadLibrary(L"geometry");
if(hMdl != NULL){ std::cout << "Library 'geometry' is loaded" << std::endl; } else{ std::cout << "Library 'geometry' is not loaded" << std::endl; } return 0;}
Biblioteca poate fi legată cu aplicație în momentul necesar cu ajutorul funcției LoadLibrary
Se utilizează WinAPI ( fișierul antet windows.h)
Utilizarea funcțiilor din dll
Dacă biblioteca dinamică dll este încărcată în memoria operativă cu ajutorul funcției LoadLibrary, atuncii ea poate fi utilizată fără biblioteca de import.
Dacă în mymath.dll sunt defenite funcții:
#pragma once
typedef unsigned long long u64;
u64 factorial(u64);
bool isSimple(u64);
#include <Windows.h>
#include <iostream>
typedef bool (*pfunc)(unsigned long long);
int _tmain(int argc, _TCHAR* argv[]){
HMODULE hMdl = LoadLibrary(L"mymath");
if(hMdl != NULL){
std::cout << "library is loaded" << std::endl;
pfunc IsPrime = (pfunc)GetProcAddress(hMdl, "isSimple");
if(IsPrime != NULL)
std::cout << "number " << 997 << " is "
<<(IsPrime(997) ? "prime" : "composed")<<std::endl;
else
std::cout << "function not found" << std::endl;
} else{
std::cout << "error library loading" << std::endl;
}
return 0;
}
Resurse din dll: funcții
Windows.h LPTSTR MAKEINTRESOURCE(WORD wInteger); HRSRC WINAPI FindResource(HMODULE
hModule, LPCTSTR lpName, LPCTSTR pType); HGLOBAL WINAPI LoadResource(HMODULE
hModule, HRSRC hResInfo); HBITMAP LoadBitmap(HINSTANCE hInstance,
LPCTSTR lpBitmapName); int WINAPI LoadString(HINSTANCE hInstance,
UINT uID, LPTSTR lpBuffer, int nBufferMax);
Resurse în dll
Utilizarea resurselor din dll
#include <Windows.h>#include <iostream>
int _tmain(int argc, _TCHAR* argv[]){ HMODULE hMdl = LoadLibrary(L"mymath"); if(hMdl != NULL){ LPTSTR str = new wchar_t[1024]; LoadString(hMdl, 101, str, 1024); MessageBox(NULL, str, 0, 0); } else{ std::cout << "error library loading" << std::endl; } return 0;}
Căutarea resursei se face după ID