Bevezetés a programozás Windows alatt

Nem számít, mennyire kívánatos, és nem tudta elkerülni a témát.

Néhány terminológiát. Lásd ezt a cikket bevezetése Win32 helytelen lenne - egy konzolos alkalmazás Windows ugyanaz teljes jogú Win32 alkalmazás. Mi egy konzolos alkalmazás? Ja - ja te rendszeresen szembesül egy ilyen program - mint például a kedvenc fájlkezelő FAR teljes konzol Win32 alkalmazás. A belépési pont a konzol alkalmazás ugyanaz, mint a DOS-os program C-ben - ez a main () függvény. Határozottan osztott Windows alkalmazás, konzol is, azt hiszem, nem lenne helyes - a program használható, mint egy belépési pontot WinMain programban (), mert úgy tűnhet, nem hoz létre ablakot, és még szervezni a saját konzol kihívás AllocConsole (!) (), és egy konzolos alkalmazás hoz létre ablakot nem okoz problémát. Csak egy ésszerű kérdés: miért van rá szükség? ;) Konzol alkalmazások jó önellátás - ezek ideális parancssori eszközök. Érdemben az alkalmazás ablakának fogok nemet mondani - csak alul megyünk közvetlenül az alkalmazás ablakok a Windows.







Nos, ez - lépni létre asztali alkalmazásokat? Amint azt már a belépési pont WinMain () Windows alkalmazások. Igen - Majdnem elfelejtettem - a példa és a forráskód ITT. Függelék abszolút könnyű - nem vár semmit szokatlan tőle. Célunk az, hogy megértsük az alapötlet.

Tehát WinMain (). Nézzük kezelni annak meghatározását. Nos, mi a függvény visszatérési int, egyértelmű (mellesleg, ő visszatér mindig -, hogy felülbírálja a visszatérési értéke mondjuk a semmiben nem fog működni - a fordító hibát generál) -, de ez az, amit WinAPI? Egy tapasztalt olvasó már (ha szembe hasonló) keresgélni fejlécek * .h fájlokat a Windows ( „fejlécek”) a keresési WinAPI makró. Meghatározása van windef.h. Tényleg, hogy van helyettesítve WinAPI, ez függ a platform (OS) és a változat a fordító. Tehát mi is ez? Ez a hívási konvenció funkciót. Mi ez? A tény az, hogy minden magas szintű program (természetesen beszélünk összeállítói és tolmácsok nem) adás összeállításában mash-kódok érthető a processzor. Most kell egy minimális ismerete Intel IA-32 architektúra (elég, még korábban) processzorokat. Assembly nyelven (a nyelvet, amelyen az egyik csapat hasonlít ahhoz, kommandós gépi kód - általában ugyanazon a gépen kódot, de érthető, hogy az emberi alak) nem függvényhívás paraméterekkel, valamint visszatér az eredménnyel - de van egy halom, regiszterek, feltétel nélküli ugrást JMP és szubrutinhívás hívást. Milyen kód létrehoz egy fordítóprogram - tőle függ - nem fogom érinteni ezt a hatalmas tárgy - kivéve azt, hogy számos olyan megállapodások, amelyekkel a fordító generál kódot meghívni - íme néhány közülük (az út - a program írt szerelő kézzel nem feltétlenül tartják be olyan megállapodások és miért programozó könnyen kezelhető a szükséges nyilvántartások rá -.? mert azt írja a funkció is, az más kérdés, ha ez használ szabványos könyvtárak -. most korlátozott specifikáció API használják őket):

* __stdcall - paraméterek át a köteget - jobbról balra (fordított sorrendben - az első érvelés a verem utolsó). Hívott eljárás „értéke” ESP verem mutató „a helyszínen”. A legtöbb Win32 funkciókat használja ezeket a megállapodásokat.

* __cdecl - paraméterek át a köteget jobbról balra. A hívó (az egyik, ahonnan a hívást kezdeményezték) „szabályok” verem. Klasszikus kihívás Xi.







* __pascal - paraméterek át a köteget, balról jobbra. Stack „uralkodott” a hívott eljárás. Tipikus megállapodás kéri, hogy „Pascal”.
thiscall - paraméterek át a köteget jobbról balra, valamint az ECX regiszter egy mutatót a C ++ ezt. Hívó „helyes” verem. Calling C ++.
  • __fastcall - az első és a második paraméter átadásra kerül egy pár ECX és EDX regisztrálja, a többi - a kéményen át jobbról balra, a funkció az úgynevezett „szabályok” verem. Borland Megállapodás (amely már régóta Inprise;) minden Inprise Delphi és C ++ Builder'ov.

    Teljes megértése adok egy példát, hogyan kell összeszerelni a legvalószínűbb hívja a következő funkciót __cdecl megállapodás:

    ParseString ( "Ez csak egy string!", 0x12);

    És most szerelő szöveg:

    Ennyit a megállapodások - WinAPI - határozza meg egy ilyen típusú (nem mindegyik természetesen - egy pár három), attól függően, ahogy azt már említettem, a platform, vagy használt fordítóprogram. Paraméterek WinMain ():

    * HINSTANCE - ez az alkalmazás példány azonosítója. Ne félj típusú HINSTANCE. Ez valószínűleg néhány unsigned int. Minden alkalmazás egy egyedi számot, hogy hívja a csonk olvas GetModuleHandle (), majd elküldi neked. Ha fogja olvasni mellékletében ezt a funkciót az alkalmazás ID - látni fogja, hogy ez egybeesik azzal a ténnyel, hogy már át WinMain (). Ez az azonosító hasznosak számunkra oly sok célra.

    * HPrevInstance - ez az azonosítója a korábbi példánya a kérelmet. Win32 alatt ez mindig NULL. Itt van neked dönteni - dolgozni, akár nem - az én például, én valóban megtagadják a munkát, ha a második paraméter nem NULL. Mellesleg - szétszedi Quake1, Quake2 és Quake3 - látod ugyanazt a dolgot.

    * LpCmdLine - egy mutatót a parancssor nélkül - osztás paraméterek - egy monolitikus sor.

    * NCmdShow - Ez a paraméter a zászlókat az ablakon - úgy, ahogy megjelenik a képernyőn, hogy hozzon létre. Általában ezt a beállítást vezetjük ShowWindow () hívást. Kérelmében, nem használja, de egyszerűen át a ShowWindow () doboz SW_SHOW.

    Nem fogod elhinni, hogy továbbra is a legegyszerűbb - regisztrálja az alkalmazás osztály, és hozzon létre az ablakot, és indítsa el az üzenetet hurok. Azt már tudjuk, hogy a Windows „esemény-alapú” operációs rendszer (az eredetiben úgy hangzik, tömörebben - eseményvezérelt). Ez azt jelenti, hogy minden alkalmazás (vagy inkább annak ablak) küldött néhány üzenet kódok, amelyekre kérelmet tud válaszolni. Nos, például a kérelmet küld WM_CREATE üzenet, ha egy ablak létrehozásakor, de előtte jelenik meg a képernyőn. WM_KEYDOWN vagy ha megnyomja a gombot (ek) és az ablak a hangsúly. Ez azonban nem jelenti azt, hogy az összes üzenete neked kell kezelni - egyáltalán nem. Most menjünk vissza a kérelmet osztály év:

    Ez a kódrészletet felelős regisztráció az ablak osztály - igen, pontosan - inkább azt, hogy ez még egy ablak osztály.

    Ebben a cikkben megjegyzésjelet a kódot ahhoz, hogy nem töltenek sok időt leíró akció és így érthető. Pár fenntartások - Resource Identifier - állandó, amely leírja a száma az erőforrás - én kérelmet nem kell a forrásokat - ha voltak - tudta használni őket - meghatározza Alkalmazás letöltésekor például azonosítót, a második - egy erőforrás-azonosító. Továbbra?

    Megjegyzés - ez hívja a CreateWindow (Ex) a Windows létrehozni minden szabványos ellenőrzéseket - a gombokról, befejező ListBox'ami. Számukra vannak előre definiált osztályok neveit, néhány további álláshelyeket az ablak kezelések, stílusok, stb Mi az? Továbbra is a számunkra, hogy indítsa el az üzenetet hurok:

    Hívja a GetMessage () értéke 0 (azaz „false”) csak akkor, ha kap egy üzenetet WM_QUIT - kérés, hogy állítsa le. Az első paraméter - a mutató egy szerkezet, amely tele lesz adatokat egy üzenet - néhány számát és egyéb hasznos információkat.

    A második paraméter az ablak azonosítója (HWND) - múló NULL kérem üzenetek feldolgozására a Windows-alkalmazások -, mert lehet sokat. Az utolsó két számjegy - egy szűrő üzenetek feldolgozása folyamatban - a minimum és maximum értékek az üzenet. Nem használja a szűrőt - és emiatt nullák. GetMessage () - blokkolja a funkció - ami azt jelenti, hogy amíg az üzenet, amely kielégíti a szűrő vagy WM_QUIT nem kapott - a teljesítés folytatjuk. Játékokhoz és egyéb alkalmazásokhoz ez elfogadhatatlan - ebben az esetben jobb, hogy egy másik üzenetet hurokszerkezeten - például az egyik, hogy már a példákban használt Direct3D. Miután az üzenet fogadása, azt le kell fordítani (TranslateMessage), és szentelt az ablak eljárás (DispatchMessage). Hol van, hős az alkalomra?

    Tartsuk szem előtt, hogy ez a példa programot írtam haladva kizárólag MS Visual C, amelyet nem használ más fordító. Azonban úgy gondolom, hogy a probléma nem merül fel. Talán ez elég ahhoz, hogy kezdeni - most már csak az Ön számára. Sikeres „vadászat”!




    Kapcsolódó cikkek