Uvod u windows aplikativno programiranje

Windows API

Za potrebe windows 32bitnog aplikativnog programiranja Microsoft je razvio API - Application Programming Interface.

Za 32-bitne platforme koristi se Microsoft®Win32®API.API sadrži skup funkcija, poruka (messages) i struktura koje su smeštene u sledećim dll-ovima (dynamiclink libraries) tj. dinamičkim bibliotekama: Kernel32.dll, Advapi32.dll, GDI32.dll, User32.dll, Crtdll.dll i shell32.dll.

Funkcionalnost omogućena od strane Windows API-ja se može grupisatu u sedam kategorija:

Osnovni servisi

Omogućavaju pristup fundamentalnim resursima dostupnim Windows operativnim sistemu. Služe za rukovanje stvarima kao što su fajl sistem, procesi(processes) i niti(threads), pristup Windows registriju(windows registry) i rukovanje greškama (error handling).
Sve funkcije za rukovanje navedenim su sadržane u kernel.exe, krnl286.exe ili krnl386.exe na 16 bitnim Windows operativnim sistemima i Kernel32.dll i Advapi32.dll na 32 bitnim Windows operativnim sistemima.

Kernel32.DLL je 32 bitna dinamička biblioteka u Windows 95,98 i Me.Deo je kernela operativog sistema. Ova biblioteka služi za rukovanje memorijom , ulazno izlatnim operacijama i interuptima(prekidima). Kada se startuje Windows operativni sistem, Kernel32.dll se smesta u zaštićeni deo memorijskog prostora, da slučajno neki drugi program ne bi mogao da se prepiše preko njega u memoriji.

Graphics Device Interface

Pruža mogućnosti ispisa grafičkog sadržaja na standardne izlaze (monitore, štampače i ostale izlazne uredjaje).
Nalazi se u Gdi.exe na 16 bitnim Windows operativnim sistemima, i Gdi32.dll na 32 bitnim Windows operativnim sistemima.

User Interface

Pruža mogućnosti kreiranja i upravljanja prozorima(screen windows) i najosnovnije kontrole nad njima, kao što su dugmad i skrolbarovi, prihvatanje sadržaja od miša i tastature i ostale osnovne funkcije povezane sa GUI delom Windows operativnog sistema.
Nalazi se User.exe na 16 bitnim Windows operativnim sistemima, i User32.dll na 32 bitnim Windows operativnim sistemima. Od pojave WindowsXP operativog sistema nalazi se u Comctl32.dll zajedno sa CCL-om(Common Control Library).

Common Dialog Box Library

Omogućava aplikacijama standardne dialog prozore za otvaranje i snimanje fajlova, biranje boje i fonta itd…
Nalazi se u Commdlg.dll na 16 bitnim Windows operativnim sistemima i u Comdlg32.dll na 32 bitnim Windows operativnim sistemima. Pripada User Interface kategoriji API-ja.

Common Control Library

Omogućava aplikacija pristup nekim naprednijim kontrolama omogućenim od strane operativnog sistema. Ovo uključuje status barove, progres barove, toolbarove i tabove.
Biblioteka se nalazi u dll fajlu Commctrl.dll na 16 bitnim Windows operativnim sistemima i u Comctl32.dll na 32 bitnim Windows operativnim sistemima. Pripada User Interface kategoriji API-ja.

Windows Shell

Komponenta Windows API-ja koja dozvoljava aplikacijama da koriste funkcije omogućene od strane Shell-a operativnog sistema.
Nalazi se u shell.dll na 16 bitnim i u shell32.dll, shlwapi.dll na 32 bitnim Windows operativnim sistemima.Pripada User Interface kategoriji API-ja.

Network Services

Omogućavaju pristup raznim mrežnim mogućnostima operativnog sistema. Kao pod-komponente sadrži NetBIOS, Winsock, NetDDE, RPC…


API Funkcije

  • Funkcije za upravljanje prozorima (Windows Management).
  • Funkcije za rad sa grafičkim uređajima (GraphicsDeviceInterface–GDI).
  • Funkcije za sistemske servise (SystemServices).
  • Multimedija funkcije.
  • RemoteProcedure Calls(RPC) funkcije.

Upravljanje prozorima (WindowManagement)

Funkcije za upravljanje prozorima namenjene su za stvaranje i koriš'enje prozora za interakciju sa korisnikom u aplikaciji. Većina aplikacija će kreirati barem jedan prozor.

Rad sa grafičkim uređajima (GraphicsDeviceInterface GDI)

Funkcije za rad sa grafičkim uređajima omogućavaju aplikacijama kreiranje grafičkog izlaza odnosno prikazana na displeju (monitor),stampacu i drugim uređajima. Korišcenjem GDI funkcija, mogu se crtati linije, tekst, bitmapslike (.bmp) i sl.

Sistemski Servisi

Funkcije za rad sa sistemskim servisima pružaju aplikaciji pristup resursima računara i osobinama operativnog sistema, kao što su memorija, fajl sistem (file systems) i procesi.
Aplikacija koristi funkcije za rad sa sistemskim servisima za upravljanje resursima računara koji su potrebni aplikaciji za rad.
Na primer

  • funkcije za upravljanje memorijom (memory management functions) aplikacija koristi za alociranje i oslobađanje potrebne memorije,
  • funkcije za upravljanje procesima i sinhronizaciju(process management and synchronization functions) za pokretanje i koordiniranje rada više aplikacija ili višestrukih niti (multiple threads of execution) unutar iste aplikacije.

Multimedija

Multimedijske funkcije omogućavaju aplikaciji rad sa audio i video elementima.
Korišcenjem ovih funkcija, aplikacija može stvarati dokumente koji uključuju u sebi muziku, zvučne efekte, video klipove…

Remote Procedure Calls (Pozivi udaljenih procedura)

RPC se koristi kod distribuiranih aplikacija.
Primeri distribuiranih aplikacija su deljene baze podataka (shared databases), udaljeni fajl serveri (remotefile servers), udaljeni printer serveri (remoteprinter servers).


MFC

Windows programiranje osim korišcenjem API funkcija može vršiti i korišcenjem Microsoft Foundation Class biblioteke (MFC).
Uopsteno, MFC sadrži C++ klase koje opisuju objekte kao što su prozori, dijalog prozori (dialog boxes) i slični objekti važni za grafički korisnički interfejs.
MFC funkcije clanice klasa pozivaju API funkcije i olakšavaju znatno kreiranje aplikacija u odnosu na direktno pozivanje API funkcija.

mfc.jpg

Multitasking i multiprocessing

Multitasking je tehnika operativnog sistema koja omogućava da jedan procesor istovremeno izvršava više niti (threads).
Multiprocessing se odnosi na računar koje ima više od jednog procesora.
Višeprocesorski računar može izvršavati nekoliko niti odjednom, na svakom procesoru po jednu nit.

Multitasking operativni sistem samo na izgled istovremeno izvršava više niti. Ustvari procesor skače s jedne niti na drugu dok kod višeprocesorskog operativnog sistema se stvarno istovremeno izvršava više niti.

Aplikacija koja se izvodi naziva se proces.
32-bitni windows operativni sistem je Multitasking operativni sistem koji podržava više niti koje se izvode unutar procesa.

Win32 Tipovi podataka

Osnovni tipovi (Simple types)
HINSTANCE Handle na instancu.
LPSTR pokazivač na string ANSI karaktera (ANSI characters)
WNDPROC pokazivač na proceduru prozora.
HANDLE Handle na objekt
HICON Handle na ikonu
HCURSOR Handle na kursor
HBRUSH Handle na brush
ATOM Atom (referenca na string karktera u tablici atoma)

Handle

Handle je referenca na neki podatak, slično kao pokazivač.
Ali za razliku od pokazivača, handle se ne može dereferencirati.
Većini objekata se pristupa preko handle-a (prozoru, ikoni, meniju, …)

Tipovi handle
HACCEL
HBITMAP
HBRUSH
HCURSOR (handle na kursor)
HDC
HDRVR
HENHMETAFILE
HFONT
HGDIOBJ
HGLOBAL
HHOOK
HICON (handle na ikonu)
HINSTANCE (handle na instancu programa)
HKEY
HMENU (handle na meni)
HMETAFILE
HMODULE
HPALETTE
HPEN
HRGN
HRSRC
HSTR
HTASK
HWND (handle na prozor)

Imenovanje promenljivih - Konvencije

Prefix Tip podatka Značenje
b BYTE 8 bitni unsigned integer
ch CHAR karakter (8 bitna signed vrednost)
d DOUBLE double promenljiva
dw DWORD 32 bitni unsigned integer
f BOOL Bool promenljiva (nula je false; različito od nule je true)
f WORD bit zastave (flags) spakovani u 16 bitni integer
gh GLOBALHANDLE handle na globalnu memoriju od funkcije GlobalAlloc
h HANDLE 32 bitni unsigned integer, handle na objekt
hwnd HWND handle na prozor
l LONG 32 bitni signed integer
lp FAR* 32 bitni far (long) pokazivac
n SHORT 16 bitni signed integer
np FAR* 32 bitni pokazivac
p * (pointer) 32 bitni pokaziva
pt POINT 32 bitne x,y koordinate spakovane u strukturu
rgb RGB RGB vrednosti boja spakovane u DWORD
sz CHAR ARRAY Null terminirani niz karaktera ("aaaaa\0")
w WORD 16-bitni unsigend integer(osim wPARAM -32-bitni parametar poruke)

Poruke

Za razliku od DOS aplikacija, Windows aplikacije su pokretane događajima (event-driven).
To znači da aplikacija ne poziva eksplicitno funkciju kojom se dobavlja ulaz (miš, tastatura,…) već čeka da sistem sam pošalje neki ulaz aplikaciji (tj da posalje message, poruku).
Operativni sistem šalje sve ulaze aplikacije na neki od prozora aplikacije.
Svaki prozor ima funkciju WndProc koju poziva operativni sistem svaki put kad ima ulaz za prozor.
Ta funkcija obrađuje ulaz i nakon toga vraća kontrolu operativnom sistemu.

Poruke prozoru

Operativni sistem šalje ulaz WndProc funkciji u obliku poruka (messages).
Poruke generise i operativni sistem i aplikacija.
Operativni sistem generise poruku svaki put kad se desi neki događaj (pomeranje miša, pritisak na tastatur u…).
Operativni sistem takođe generise poruke kao odgovor na promene uzrokovane aplikacijom (npr. promena veličine prozora).
Aplikacija može generisati poruke da bi njeni vlastiti prozori izvršili neki zadatak ili da bi komunicirali sa prozorima drugih aplikacija.

Tipovi poruka

  • sistemske poruke (poruke od strane operativno sistema)
  • aplikacijske poruke (poruke od strane aplikacije)

Sistemske poruke

Operativni sistem šalje poruku kad komunicira sa aplikacijom.
Porukama kontrolise rad aplikacije i šalje ulaze i druge informacije aplikaciji na obradu.
Svaka sistemska poruka ima jedinstveni identifikator poruke i odgovarajuću simboličku konstantu (definisanu u SDK (software development kit) header datotekama) koji iznosi svrhu poruke.
Npr. WM_PAINT konstanta zahteva da se prozor ponovo iscrta.

Simboličke konstante takođe opisuju kojem tipu pripada poruka.
Prefiks simboličke konstante određuje koji tip prozora može interpretirati i obraditi poruku.

Prefix Message Category
ABM Application desktop toolbar
BM Button control
CB Combo box control
CBEM Extended combo box control
CDM Common dialog box
DBT Device
DL Drag list box
DM Default push button control
DTM Date and time picker control
EM Edit control
HDM Header control
HKM Hot key control
IPM IP address control
LB List box control
LVM List view control
MCM Month calendar control
PBM Progressbar
PGM Pager control
PSM Property sheet
RB Rebar control
SB Status bar window
SBM Scrollbar control
STM Static control
TB Toolbar
TBM Trackbar
TCM Tab control
TTM Tooltip control
TVM Tree-view control
UDM Up-down control
WM General window

Aplikacijske poruke

Aplikacija može stvoriti poruke koje će koristiti njeni vlastiti prozori ili za komunikaciju sa prozorima druge aplikacije.
Identifikatori poruka mogu koristiti sledeće vrednosti:

  • Operativni sistem rezerviše vrednosti od 0x0000 do 0x03FF za sistemske poruke. Aplikacije ne mogu koristiti ove identifikatore za svoje privatne poruke.
  • od 0x0400 do 0x7FFF su vrednosti raspoložive za identifikatore privatnih poruka aplikacija.
  • za registrovanje poruke aplikacija može pozvati i funkciju RegisterWindowMessage i u tom slučaju operativni sistem vraća identifikator poruke u rasponu vrijednosti od 0xC000 do 0xFFFF. Korišćenjem ove funkcije aplikacija je sigurna da koristi jedinstveni identifikator poruke koji ne koristi ni jedna druga aplikacija.

Usmeravanje poruka

Postoje dva načina na koji operativni sistem šalje poruku:

  • smeštanje poruka u FIFO red čekanja koji se zove red poruka (message queue). To je sistemski definisan objekt koji privremeno čuva poruke.
  • slanje poruke direktno prozoru.

Svaki proces koji se izvodi ima svoj red čekanja poruka i sam je odgovoran za obrađivanje poruka iz svog reda čekanja.

Obrada poruka

Aplikacija mora obraditi poruke iz svog reda čekanja. Aplikacija sa samo jednim procesom obično koristi petlju poruka.
Aplikacija sa više proces treba uključiti petlju poruka u svaki proces koji kreira prozor.

Petlja poruks

Jednostavna petlja poruka sastoji se od jednog poziva svake od sledeće tri funkcije:

  • GetMessage
  • TranslateMessage
  • DispatchMessage

GetMessage funkcija uzima poruku iz reda čekanja i kopira je u strukturu tipa MSG. Ako se navede drugi parametar u funkciji (to je handle na neki prozor) onda će petlja obrađivati samo poruke za taj prozor.

MSG msg;
BOOL bRet;
    while( (bRet=GetMessage( &msg, NULL, 0, 0 )) != 0){ 
        if (bRet== -1) {
        //handle the error and possibly exit
        } else {
            TranslateMessage(&msg);
            DispatchMessage(&msg); 
            }
    }

MSG

MSG struktura sadrži informaciju iz reda poruka dotičnog procesa.

typedef struct tag MSG { 
    //msg
    HWND hwnd;
    UINT message;
    WPARAM wParam; 
    LPARAM lParam; 
    DWORD time; 
    POINT pt; } MSG

hwnd handle na prozor koji prima tu poruku.
message broj poruke.
wParam dodatne informacije o poruci.
lParam dodatne informacije o poruci.
time vreme kada je poruka poslata.
pt pozicija kursora u koordinatama ekrana kada je poruka poslata.

Unless otherwise stated, the content of this page is licensed under GNU Free Documentation License.