Delphi - Nem dokumentált függvényhívások a Windows-ban

2. rész

forráskód letöltése
A cikksorozat múlt heti részében megismerkedhettünk a Shell32.dll néhány nem dokumentált függvény hívásával. Mostani részben tovább vizsgáljuk ennek a rejtett lehetőségeit. A cikksorozat múlt heti részében megismerkedhettünk a Shell32.dll néhány nem dokumentált függvény hívásával. Mostani részben tovább vizsgáljuk ennek a rejtett lehetőségeit.


A mellékelt példaprogram megnyitása előtt a BrowseDialog.pas-ban található komponenst telepíteni kell a Delphi-be.

Múlt heti ismereteket felhasználva az ottani forráskódot fogjuk most továbbfejleszteni úgy, hogy egy komponenst készítünk, melyben elhelyezzük a már múltkor megismert funkciókat, melyet kiegészítünk eggyel.

Amikor a felhasználó lépked a BrowseDialog-ban, akkor lehetőségünk van arra is, hogy létrehozzunk egy eseményt, ahol lekérdezhetjük, hogy melyik is az aktuálisan kiválasztott könyvtár.

Ehhez először is kell készítenünk egy függvényt, melyet az alábbiak szerint paraméterezünk:
function (DialogHandle: HWND; MessageID: UINT; PIDL: LPARAM; ComponentPointer: LPARAM): Integer; stdcall;

Majd amikor ott tartunk, hogy a dialóg ablak megjelenítése előtt a TBrowseInfo struktúrát töltjük fel, akkor a lpfn mezőjének ezt a függvényt kell átadni. Ebből fogja tudni a Windows, hogy melyik függvényt kell meghívnia, amikor történik valamilyen esemény a dialóg ablakban.


Ezt a függvényt a mellékelt példában CallbackFunction-nak neveztük. Nézzük ezt egy kissé részletesebben.

A ComponentPointer nevű paraméterben megkapjuk azt az objektumot, amely a dialóg megjelenítését kezdeményezte. Ezt felhasználva átmenetileg létrehozunk egy TBrowseDialog típusú változót, hogy elérhessük annak a függvényeit.

A MessageID paraméterben kapott konstans vizsgálatával dönthetjük el, hogy milyen jellegű esemény történt az ablakban.

Ha BFFM_INITIALIZED az értéke ennek, akkor ez azt jelenti, hogy a dialóg ablak inicializálva lett és ettől kezdve már felhasználható a DialogHandle paraméter, mely az adott ablak azonosítóját tartalmazza.

Ebben az esetben meghívjuk a TBrowseDialog komponensünk Initialized eljárását. Itt eltároljuk az ablak azonosítóját a későbbi felhasználás érdekében. Valamint itt tudjuk beállítani az ablak fejlécének szövegét, illetve az információs szöveget.


Ha a BFFM_SELCHANGED értéket kapjuk, akkor ez azt jelenti, hogy a felhasználó megváltoztatta az aktuálisan kiválasztott alkönyvtárat a dialóg ablakban. Ekkor meghívjuk a
TBrowseDialog komponensünk Change eljárását.

Ebben az eljárásban meghatározzuk az aktuálisan kiválasztott alkönyvár nevét a SHGetPathFromIDList függvénnyel és ezt eltároljuk a komponens FSelected változójába. Majd meghívjuk a komponens OnChange eseményét, ha lett hozzárendelve eseménykezelő.

Mellékelt példában ennél az eseménynél egyszerűen csak kiíratjuk egy TLabel komponensre az éppen kiválasztott könyvtárat.

Nem dokumentált függvényhívások a Windows-ban cikksorozat