Radek ChalupaČlánkyUkázky kóduTipy a trikyAktualityŠkolení a konzultaceVývoj softwareFreewareKontakt

Motivační úvod do Win API  2.1.2002

Kdo si myslí, že naučit se (alespoň základy) Win API bude pro něj užitečné a zajímavé (a samozřejmě ještě Win API nezná) může mu tento seriál být zdrojem trochu opožděného novoročního předsevzetí, které poprvé v životě splní - "naučit se Win API". Takový jedinec může pár následujících řádek tohoto úvodu formálně jen formálně přelétnout a navázat na místě pro něj již zajímavějším. Pro ty ostatní, kteří váhají, zda má smysl "investovat" úsilí a čas do něčeho takového, jako je Win API, "v kterém dneska přece nikdo nepíše...". Dalo by se říci, API je na 2 věci... Na které? 1. V API lze napsat malý, relativně jednoduchý prográmek bez výrazné ztráty produktivity a na druhou stranu s trvalým ziskem jeho efektivnosti, především z hlediska minimalizace nároků na paměť a další systémové zdroje. Týká se to především programů běžících (většinou na pozadí) po celou dobu běhu operačního systému. A každý nemá doma počítač jako v NORADu a může pro něj být zajímavé, jestli pár takových "utilitek" na pozadí zabere každá řekněme o 1 MB více paměti plus další rozdíl ve využití ostatních systémových zdrojů proto, že k vytvoření prázdného okna je použita třeba VCL nebo MFC. 2. Druhý důvod, dnes pro většinu asi mnohem významější vás může napadnout při pročítání mnohých dotazů na diskusním fóru tohoto serveru. "Jak mám udělat tohle? ....žádná komponenta na to není. V property ani eventech jsem nic podobného nenašel?... A mnohdy jde o nějakou (pro API znalého) drobnost, jejíž znalost by tazateli ušetřila mnoho času hledání na Internetu, čekání na radu v diskusi a jeho aplikaci ušetřila pár dalších (kilo)bajtů kódu navíc, zataženého tam s nějakou nalezenou komponentou, které umí dalších 50 věcí navíc, které však v tomto okamžiku jsou v programu zcela zbytečné. A věřte tomu, že věcí které vizuálně nenaklikáte, je dost a dost. A mít nainstalovaných stovky komponent či ActiveX prvků jen kvůli tomu...to se raději zkusme naučit API, pro začátek alespoň základy. Než začneme nejdříve si řekněme něco o vhodných nástrojích. Odhlédněme od toho, že by nám stačil notepad, nějaký command-line win32 kompilátor a linker, a samozřejmě Windows SDK, tedy příslušné knihovny .lib, hlavičky .h atd. Z těch rozšířenějších vývojových prostředí je jednoznačně nejvhodnější Microsoft Visual C++ (zatím verze 6, brzy bude nová jako součást nového .Net Studia). Název  "Visual" totiž není od toho, že by se jednalo o RAD nástroj jako C++ Builder, Delhpi, Visual Basic apod. ale že má vizuální editor zdrojů (resources). Co jsou to zdroje (resources - nikoli zdrojový kód) si samozřejmě v tomto seriálu  řekneme. Zatím tolik, že použití tohoto vizuálního editoru neznamená sebemenší újmu na optimalizaci programu, což je samozřejmě velký rozdíl například oproti použití formulářů v Delhi. Tento editor vám prostě na základě vašeho grafického snažení vygeneruje textový soubor (tzv. resource script), který nijak úsporněji napsat nelze. Proto také neumí nic víc, než podporuje řekněme "jazyk resource skriptu". Tedy žádné nastavení barev tlačítka, fontu a pod. Ale udělá za vás tu práci s textových skládáním třeba dialogů "bez ztráty kytičky". Pro ty co používají VCL přirovnání - formulář můžete navrhnout také textově, napíšete prostě vlastní dfm soubor. Můžete samozřejmě celkem s úspěchem použít i C++ Builder. Zde však doporučuji pořídit si nějaký šikovný editor zdrojů. Výstupem může být jak běžný rc soubor (resource skript), tak tzv. kompilovaný soubor zdrojů (.res), který pak lze přidat snadno do projektu C++ Builderu. Rozdíl je v tom, že .res soubor je v podstatě binární soubor obsahující "vše v jednom", zatímco resource skript je textový soubor obsahující odkazy na soubory obsahující data některých typů zdrojů, jako např. ikony, bitmapy, která jsou binární a do textového souboru je samozřejmě nelze "zabalit". Tento soubor také musí projít kompilátorem, zatímco soubor .res většinou zpracovává až linker. Jinak C++ Builder obsahuje command-line kompilátor resource skriptů, takže .rc soubory vygenerované "něčím jiným" nebo napsané ručně lze pak snadno překládat. K editoru nyní již jen tolik, že C++ Builder do verze 4 (tuším od varianty Professional výše) obsahoval "Resource Workshop" od Borlandu. V době Windows 3.x výborný nástroj, dnes již zastaralý, ale stále snad použitelný. Ve verzi 5 ale již není. Bohužel, buď je to výsledek viditelné snahy Borlandu co nejvíce skrýt to základní co je pod povrchem, nebo Borland usoudil, že Resource Workshop opravdu již patří do muzea. Určitě je to škoda pro ty, kteří nechtějí krást a Visual C++ si nemohou dovolit. Ale opravdu i v C++ Builderu lze v API psát, tím spíše, že pokud se jedná o důsledek výše uvedeného důvodu číslo 2, není většinou problém s resource skripty. Další vývojové nástroje lze jistě použít ale jejich rozšíření je oproti dvěma zmíněným okrajové a ani je neznám z vlastní zkušenosti, proto se o nich nebudu zmiňovat. V posledním odstavci tohoto suchého teoretického úvodu si ještě řekněme pár "organizačních záležitostí". Pro tvorbu ukázkových příkladů budu používat Visual C++ verze 6. Všechny ukázkové aplikace budou psány v "čistém API" s použitím jazyka C/C++. Budu se snažit nepoužívat žádná C++ specifika Microsoftu. Ale nikdo není dokonalý a zvyk je zvyk, takže mě upozorněte pokud zdrojový kód nepůjde přeložit v C++ Builderu z uvedeného důvodu. Dále se budu všemožně snažit držet kompatibility s Windows SDK z doby vydání Visual C++ 6, tedy nepoužívat (alespoň na začátku, v případě zájmu samozřejmě dojde i na ně) funkce specifické pro Windows 2000 ("nedej bože" XP). I když jako motivaci předesílám, v tom novém, co je v SDK pro XP je mnoho zajímavého. Kdo může (tedy má pevnou linku nebo kabelový modem), doporučuji stáhnout poslední Windows SDK (listopad 2001) zde: http://www.microsoft.com/msdownload/platformsdk/sdkupdate/. V několika úvodních dílech (s výjimkou tohoto, příště si založíme nový projekt, a řekneme si při té příležitosti o nastaveních projektu) bude jako ukázková aplikace tentýž projekt postupně sofistikovaný tak jak se budeme učit jednotlivá základní témata. Aby nezůstalo jen u teorie. Slyšel jsem (možná zrovna v diskusi na Builderu :-)) názor, že lidé se nechtějí API učit také proto, že nemohou ihned (tj. během prvních cca 5 minut "výuky") napsat oblíbený program "Hello world". To je samozřejmě nesmysl. zde je kompletní zdrojový kód takového programu:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
  MessageBox(NULL, "Ahoj Win API !!!","První program", MB_OK);
  return 0;
}
Výsledek po spuštění vidíte zde:

win_api_1

Tedy jako skutečný program k něčemu to zrovna nevypadá, že? Ale o tom až příště!

Copyright © 2019 - Radek Chalupa