Funcţiile principale Win32 API



Universitatea Politehnic? Bucure?tiFacultatea de Electronic?, Telecomunica?ii ?i Tehnologia Informa?ieiSisteme de OperareFunc?iile principale Win32 APIProfesor coordonator: prof. univ. dr. ing. ?tefan St?ncescuStudent: Tudor ?tefan-Eugen Grupa: 433A (CTI) Anul universitar2014-2015Cuprins1.Introducere.................................................................................22.Func?ii specifice........................................................................patibilitatea cu compilatoarele...........................................54.Func?ionarea unui program Windows.......................................65.Concluzii.................................................................................106.Bibliografie..............................................................................111.Introducere?n mod normal, un program Windows este bazat pe evenimente. Programul principal a?teapt? ca un eveniment s? se ?ntample, iar apoi apeleaz? o procedur? care s? se ocupe de el(handler). Astfel de evenimente pot fi ap?sarea tastelor, mi?carea mouse-ului sau ap?sarea unui buton al mouse-ului. Handler-ul, procedura care este apelat? ca urmare a apari?iei evenimentelor, actualizeaz? ecranul ?i starea intern? a programului.La sistemul de operare Windows, apelarea bibliotecilor este decuplat? de apelarea de sistem. Microsoft a creat un set de proceduri numite Win32 Application Program Interface – pe scurt, Win32 API – care sunt folosite pentru a folosi anumite servicii de sistem. Aceast? interfa?a este compatibil?, par?ial la versiunile mai vechi, cu toate sistemele de operare Windows ?ncep?nd cu Windows 95. Decuplarea dintre apelul bibliotecilor ?i apelul de sistem permite schimbarea apelurilor de sistem ?n timp f?ra a face programele existente inutilizabile.Win32 API se bazeaz? ?n primul r?nd pe limbajul de programare C, ceea ce ?nseamn? ca func?iile ?i structurile de date sunt descrise ?n acest limbaj ?n versiunile recente ale documenta?iei. Totu?i, nu este neaparat? nevoie de un compilator C, Win32 API put?nd fi folosit de orice compilator sau asembler compatibil cu structurile de date de nivel mic.Num?rul de apeluri de Win32 API este foarte mare, ?n num?r de mii. Chiar dac? multe astfel de apeluri sunt de sistem, un num?r substan?ial de mare sunt din spa?iul utilizatorului. Ca o consecin??, ?n Windows este imposibil de spus care este un apel de sistem(efectuat de kernel) ?i care este un simplu apel de bibliotec? din spa?iul utilizatorului. ?in?nd cont de actualizarile suferite de Windows, ceea ce la o versiune este un apel de sistem, la alt? versiune poate fi un apel din spa?iul utilizatorului. Figura 1: Arhitectura WindowsFigura 2: Straturi ale Win32 API Se observ? ?mpar?irea dintre modul Utilizator ?i modul Kernel:modul utilizator con?ine: aplica?iile, DLL-urile sistemului Windows, Ntdll.dll.modul Kernel con?ine: apelurile de sistem, driverele de sistem.Aceste dou? moduri comunic? printr-o interfa?a numit? System-Call. Aceast? interfa?? asigur? posibilitatea unui program de a cere accesul la un serviciu Kernel-ului unui sistem de operare.Figura 3:Compatibilitatea programelor bazate pe Win32 la diferite versiuni de Windows2.Func?ii specificeFunc?ionalitatea dat? de Windows API poate fi grupat? ?n 8 categorii:Servicii de baz? (Base Services) – asigur? acces la resursele fundamentale disponibile unui sistem Windows, unde sunt incluse: fi?iere, procese, fire de execu?ie, rezolvarea erorilor - aceste func?ii se g?sesc ?n kernel.exe, krnl286.exe sau krnl386(pentru Windows 16-bit) ?i ?n kernel32.dll (pentru Windows 32-bit).Servicii avansate (Advanced Services) – asigur? acces la func?ionalit??i adi?ionale kernel-ului, ca: registrii Windows, ?nchiderea/repornirea sistemului, pornirea/oprirea/creerea unui serviciu Windows, administrarea conturilor utilizatorilor – aceste func?ii se g?sesc ?n advapi32.dll (pentru Windows 32-bit).Interfa?a grafic? (Graphics Device Interface) – asigur? func?ionalitate pentru ie?irea de continut vizual la monitoare, imprimante, pe l?nga alte dispozitive de ie?ire – se g?sesc ?n gdi.exe (Windows 16-bit) sau gdi32.dll (Windows 32-bit) pentru modul utilizator. Pentru modul kernel se g?sesc ?n win32k.sys, care comunic? direct cu driver-ul grafic.Interfa?a utilizatorului (User Interface) – asigur? func?ionalit??i cu ajutorul c?rora se pot crea ?i administra ferestre ?i majoritatea controlului de baz?, cum ar fi: butoanele ?i bara de defilare, primirea de informa?ie de intrare de la mouse ?i tastatur? – se g?se?te ?n user.exe(Windows 16-bit) ?i user32.dll(Windows 32-bit). ?ncep?nd cu Windows XP, comenzile de baz? se g?sesc ?n comctl32.dll, ?mpreun? cu comenzile comune.Biblioteca func?iilor de dialog ?n fereastr? (Common Dialog Box Library) – asigur? aplica?iilor accesul la ferestrele standard de dialog pentru a deschide ?i salva fi?iere, pentru alegerea de culoare ?i font – biblioteca se g?se?te ?n commdlg.dll(Windows 16-bit) ?i ?n comdlg32.dll(Windows 32-bit) – intr? ?n categoria de Interfata Utilizatorului ?n cadrul API-ului.Biblioteca de comenzi comune (Common Control Library) – asigur? aplica?iilor accesul la func?ii avansate de control puse la dispozi?ie de sistemul de operare – sunt incluse: bara de stare, bara de progres, bara de unelte etc. Aceste biblioteci se g?sesc ?ntr-un fi?ier dll numit commctrl.dll(Windows 16-bit) ?i comctl32(Windows 32-bit) – intr? ?n categoria de Interfa?a Utilizatorului ?n cadrul API-ului.Windows Shell – asigur? aplica?iilor func?ionalitatea oferit? de shell-ul sistemului de operare, c?t ?i posibilitatea de a ?l modifica ?i ?mbun?t??i – componentele se g?sesc ?n shell.dll(Windows 16-bit) ?i shell32.dll(Windows 32-bit). Func?iile Shell Lightweight se g?sesc ?n shlwapi.dll ?i intr? ?n categoria de Interfa?a Utilizatorului ?n cadrul API-ului.Servicii de re?ea (Network Services) – ofer? acces la numeroasele func?ii de re?ea ale sistemului de operare – se g?se?te ?n netapi32.dll (Windows 32-bit). patibilitatea cu compilatoarelePentru a dezvolta aplica?ii care folosesc Windows API, un compilator trebuie s? poat? folosi DLL-urile (Dynamic Link Library) specifice Microsoft. Compilatorul trebuie de asemenea s? se ocupe de fi?ierele header care expun numele intern al func?iilor API, sau s? furnizeze el ?nsu?i asemenea fi?iere.Pentru anumite aplica?ii, compilatorul trebuie s? poat? folosi fi?iere IDL(Interface Definition Language). Puse la un loc, aceste necesit??i(compilatoarele, uneltele, bibliotecile ?i fi?ierele header) sunt cunoscute ca Kitul de dezvoltare software Microsoft(Microsoft Platform SDK).Suport special pentru compilatoare Windows este necesar ?i pentru mecanismul SEH(Structured Exception Handling). Acest sistem are dou? func?ionalit??i: prin intermediul lui kernel-ul notific? aplica?ia de anumite condi?ii excep?ionale, cum ar fi umplerea stivei ?i asigur? un substrat pe care pot fi implementate anumite metode de manipulare a excep?iilor.SEH se bazeaz? pe introducerea manipulatorilor de excep?ii ?n stiva, apoi adaugarea acestora ?ntr-o list? legat?(linked list) stocat? ?n memoria local? a firului de execu?ie. C?nd o excep?ie este aruncat?, kernelul ?i bibliotecile de baz? deruleaz? stiv? care ruleaz? manipulatori ?i ?i filtreaz? pe m?sur? ce ?i descoper?. ?n final, orice excep?ie care nu este tratat? de aplica?ie ?n sine, va fi rezolvat? prin manipulatorul standard de tratare a excep?iilor – backstop handler. Acesta produce apari?ia unei ferestre dialog de tip eroare.?n ziua de azi, MinGW ?i Cygwin ofer? un asemenea mediu bazat pe GNU Compiler Collection, folosind o colec?ie de fi?iere header de sine st?tatoare pentru a face simpl? leg?tura cu DLL-urile Win32. Figura 4: Crearea unui program folosind un compilator standard Win32 4.Func?ionarea unui program WindowsC?nd o fereastr? este creat?, parametrii specific? dac? aceasta poate fi mutat?, redimensionat?, sau dac? poate fi derulat? de c?tre utilizator. Fereastr? principala a majorit??ii programelor poate fi mutat?, redimensionat?, fapt? care are consecin?e enorme ?n scrierea programelor Windows. ?n privat, programele trebuie sa fie anun?ate de schimb?ri ?n dimensiuni ale ferestrelor ?i trebuie s? fie preg?tite s? redeseneze con?inutul ?n orice moment al rul?rii.Prin urmare, programele Windows sunt orientate pe mesaje. Ac?iunile utilizatorilor care includ tastatura ?i mouse-ul sunt re?inute de Windows ?i convertite ?n mesaje programului care de?ine fereastra adresat?. Fiecare program are o coad? ?n care sunt trimise mesajele care se refer? la ferestrele lui. Bucla principal? a programului const? ?n scoaterea urmatorului mesaj din coad? ?i procesarea acestuia prin apelarea unei proceduri interne pentru tipul respectiv de mesaj. ?n unele cazuri, aceste proceduri pot fi apelate de ?nsu?i Windows, trec?nd peste coada de mesaje.?n exemplul de mai jos, este prezentat? structura scheletului unui program principal pentru Windows.Programul ?ncepe prin includerea unui fi?ier header, care con?ine macro-uri(text care con?ine o secven?? de apeluri sau rutine), tipuri de date, constan?e, prototipuri de func?ii ?i alte informa?ii necesare de programele Windows. Urmeaz? declararea numelui ?i parametrilor. Macro-ul WINAPI este o instruc?iune adresat? compilatorului, f?c?ndu-l pe acesta s? foloseasc? un anumit parametru. Primul parametru, h, este o instan?a de manipulator(handler) care este folosit? pentru a identifica programul ?n cadrul ?ntregului sistem. ?n mare parte, Win32 este orientat pe obiecte, ceea ce ?nseamn? c? sistemul con?ine obiecte(programe, fi?iere, ferestre) care au stare ?i cod asociat, numite metode, care opereaz? ?n acea stare. Obiectele folosesc manipulatori, iar ?n acest caz, h identific? programul. Al doilea parametru este prezent numai pentru compatibilitatea cu versiunile anterioare. Al treilea parametru, szCmd, este un ?ir de caractere care con?ine linia de comand? care a pornit programul, chiar daca nu a fost pornit dintr-o linie de comand?. Al patrulea parametru, iCmdShow, specific? daca fereastra ini?ial? ar trebui s? ocupe ?ntregul ecran, doar o parte din ecran sau nicio parte din ecran(doar ?n bara de procese).Fiecare fereastr? trebuie sa aib? asociat? o clas? obiect care sa ii defineasc? propriet??ile. ?n cazul nostru, acea clas? este wndclass. Un obiect de tipul WNDCLASS are 10 toate fiind ini?ializate ?ntr-un program normal. Cel mai important c?mp este IpfnWndProc, care este un pointer pe 32 de biti c?tre func?ia care se ocup? de mesajele direc?ionate c?tre fereastr?.Dup? ini?ializarea wndclass, RegisterClass este apelat? pentru a o trece sistemului. Urm?toarea apelare, CreateWindow, aloc? memorie pentru structurile de date ale ferestrei ?i returneaz? un manipulator pentru a ?l referen?ia mai tarziu. Programul mai face dou? apeluri, pentru a pune conturul ferestrei pe ecran ?i pentru a o umple complet.Bucla principal? a programului const? ?n primirea unui mesaj, efectuarea anumitor opera?ii asupra lui, iar apoi trimiterea acestuia ?napoi la Windows. Figura 5: Exemplu de schelet al unui program main#include <windows.h>int WINAP WinMain(HINSTANCE h, HINSTANCE, hprev, char *szCmd, int iCmdShow){WNDCLASS wndclass;/* class object for this window */MSG msg;/* incoming messages are stored here */HWND hwnd;/* handle (pointer) to the window object *//* Initialize wndclass*/wndclass.lpfnWndProc = WndProc; /* tells which procedure to call */wndclass.lpszClassName = ”Program name”; /* text to the title bar */wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* load program icon */wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); /* load mouse cursor */RegisterClass(&wndclass);/* tell Windows about wndclass */hwnd = CreateWindow(...)/* allocate storage for the window */ShowWindow(hwnd, iCmdShow);/* display the window on the screen */UpdateWindow(hwnd);/* tell the window to paint itself */while(GetMessage(&msg, NULL, 0, 0)){ /* get message from queue */TranslateMessage(&msg);/* translate the message */DispatchMessage(&msg);/* send msg to the appropiate procedure */}return(msg.wParam);}long CALLBACK WndProc(HWND hwnd, UINT message, UINT wParam, long lParam){/* Declarations go here. */switch(message){case WM_CREATE: ...;return ...; /* create window */case WM_PAINT: ...;return ...; /* create window */case WM_DESTROY: ...;return ...; /* create window */}return(DefWindowProc(hwnd, message, wParam, lParam)); /* default */}Dupa programul principal urmeaz? procedura WndProc, care se ocup? de diferite mesaje ce pot fi trimise ferestrei. CALLBACK este folosit pentru a specifica secven?a de apelare pentru parametrii. Primul parametru este manipulatorul pe care sa ?l foloseasc? fereastra. Al doilea parametru este tipul mesajului. Al treilea ?i al patrulea parametru pot fi folosi?i pentru a aduce informa?ii suplimentare ?n cazul ?n care este nevoie.WM_CREATE si WM_DESTROY sunt tipuri de mesaje care sunt trimise la ?nceputul, respectiv sf?r?itul, unui program. Dau posibilitatea programului s? aloce memorie pentru structuri de date iar apoi s? le returneze.Al treilea tip de mesaj, WM_PAINT, este o instruc?iune adresat? programului, ca acesta sa umple fereastr?. Nu este apelat? numai la ?nceput, c?nd este desenat? fereastra, ci ?i pe ?ntreg parcursul execu?iei programului. Spre deosebire de sistemele de operare bazate pe text, ?n Windows, un program nu poate presupune ca orice deseneaz? pe ecran va r?m?ne acolo p?n? c?nd este ?ters. Alte ferestre pot fi trase peste aceasta, meniurile pot fi trase ?n jos peste fereastr?, ferestrele dialog ?i sfaturile pentru unelte o pot acoperi par?ial. C?nd sunt ?nl?turate, fereastra care a fost acoperit? trebuie s? fie redesenat?. Windows transmite unui program nevoia de a redesena o fereastr? printr-un mesaj de tip WM_PAINT. Se transmit de asemenea ?i informa?ii cu privire la ce parte a ferestrei a fost acoperit?, ?n caz c? este mai u?or de redesenat acea parte a ferestrei, fa?? de a redesena ?ntreag? fereastr?.Windows ?i poate transmite unui program o instruc?iune prin dou? modalit??i: prima este plasarea unui mesaj ?n coada de mesaje a acestuia. Aceast? metod? este folosit? pentru date de intrare de la tastatur?, mouse sau de la cronometre care au expirat. A dou? metod? presupune apelarea directa de c?tre Windows a WndProc. Aceast? metod? este folosit? pentru restul de evenimente. Din moment ce Windows este notificat c?nd un mesaj este procesat ?n ?ntregime, poate a?tepta transmiterea unui nou apel p?n? c?nd cel actual este terminat.?n cazul ?n care apare un mesaj nea?teptat ?i pentru a evita un comportament ?nt?mpl?tor, programul ar trebui s? apeleze DefWindowProc la sf?r?itul lui WndProc pentru a l?sa manipulatorul standard s? rezolve aceste cazuri.De desenatul pe ecran se ocup? un pachet care con?ine sute de proceduri puse la un loc pentru a forma GDI (Graphics Device Interface). Acesta se poate ocupa de text ?i de toate tipurile de grafic? ?i este conceput astfel ?nc?t sa fie independent de platforma ?i dispozitiv. ?nainte ca un program s? deseneze ?ntr-o fereastr?, trebuie s? capete contextul de dispozitiv, care este o structur? de date intern? care con?ine atribute ale ferestrei, cum ar fi fontul curent, culoarea textului, culoarea de background etc. Majoritatea apelurilor GDI folosesc contextul de dispozitiv, fie pentru a desena sau pentru a seta sau a lua propriet??ile.Exist? numeroase posibilit??i pentru a c?p?ta contextul dispozitivului. Un exemplu este:Exemplu de preluare a contextului de dispozitiv:hdc = GetDC(hwnd);TextOut(hdc, x, y, psText, iLength);ReleaseDC(hwnd, hdc);Prima afirma?ie preia un manipulator pentru un context de dispozitiv, hdc. A doua afirma?ie folose?te contextul dispozitivului pentru a scrie o linie de text pe ecran, specific?nd coordonatele (x, y) de unde ?ncepe sirul, un pointer la ?ir ?i lungimea acestuia. Al treilea apel decupleaz? contextul dispozitivului pentru a ar?ta c? programul a terminat de desenat pentru moment. De men?ionat este c? ReleaseDC con?ine informa?ii redundante (folosirea lui hdc specific? ?n mod unic o fereastr?). Folosirea de informa?ie redundant? care nu are valoare efectiv? este ?nt?lnit? ?n mod comun la Windows.Pe scurt, un program Windows construie?te, ?n mod normal, una sau mai multe ferestre cu o clas? obiect pentru fiecare. Asociat? fiec?rui program este o coad? de mesaj ?i un set de proceduri de manipulare. Comportamentul programului este determinat de evenimentele pe care le ?nt?mpin?, care sunt procesate de procedurile de manipulare. 5.ConcluziiWin32 pune la dispozi?ie interfe?e cuprinz?toare cu mul?i parametrii, de obicei cu trei sau patru moduri de realizare a aceluia?i lucru. Asta ?nseamn? c? Win32, de?i pune la dispozi?ie un set de interfe?e foarte bogat, introduce ?i o mare complexitate cauzat? de stratificarea slab?, care amestec? func?iile de nivel ?nalt cu func?iile de nivel jos.Win32 are apeluri pentru a crea ?i a administra at?t procese cat ?i fire de execu?ie. Exist? de asemenea ?i numeroase apeluri care au ca scop comunicarea interproces, cum ar fi crearea, distrugerea ?i folosirea mutexe-urilor (concept de programare folosit pentru rezolvarea problemelor de multithreading), semafoare, evenimente, porturi de comunica?ie ?i alte obiecte IPC. 6.Bibliografie S. Tanenbaum Modern Operating Systems, 3rd Edition 2008Andrew S. Tanenbaum, Herbert Boss Modern Operating Systems, 4th Edition 2014 ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download

To fulfill the demand for quickly locating and searching documents.

It is intelligent file search solution for home and business.

Literature Lottery

Related searches