3. biblioteci de programare

Post on 15-Jun-2015

5.014 views 2 download

description

Elaborarea aplicatiilor complexe poate fi smiplificata daca problema de elaborare se imparta in probleme mai mici. Atunci fiecare solutie va fi reprezentata printr-un modul - biblioteca de programare. In cadrul prezentarii se face descrierea bibliotecilor de programare, modul de elaborare si de utilizare a lor

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