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

1. rész

forráskód letöltése
Vannak olyan függvények a Windows-ban, melyeket "elfelejtettek" hivatalosan dokumentálni. Valószínűleg nem is kevés van ezekből. Ilyen eset például a Shell32.dll, melyben lévő függvények egy része megtalálható még akár a Delphi help-jében is, de egy másik része már nem igazán.

Attól, hogy ezek a függvények nem dokumentáltak, még léteznek és tökéletesen használhatóak is. Egyetlen plusz feladat velük csupán annyi, hogy nekünk kell a programunk forráskódjában deklarálni őket:
Például: function ILCreateFromPath(Path: Pointer): PItemIDList; stdcall; external 'shell32.dll' index 157;

És ettől kezdve máris használható. Vannak olyan függvények a Windows-ban, melyeket "elfelejtettek" hivatalosan dokumentálni. Valószínűleg nem is kevés van ezekből. Ilyen eset például a Shell32.dll, melyben lévő függvények egy része megtalálható még akár a Delphi help-jében is, de egy másik része már nem igazán.

Attól, hogy ezek a függvények nem dokumentáltak, még léteznek és tökéletesen használhatóak is. Egyetlen plusz feladat velük csupán annyi, hogy nekünk kell a programunk forráskódjában deklarálni őket:
Például: function ILCreateFromPath(Path: Pointer): PItemIDList; stdcall; external 'shell32.dll' index 157;

És ettől kezdve máris használható.


Jó néhány programban találkozhatunk olyan esettel, hogy a felhasználótól be kell kérnünk egy alkönyvtárat. Ilyen feladat könnyen előfordulhat saját alkalmazásunkban is.

Ehhez felesleges külön beviteli ablakot készítenünk, mert a Windows-ban már található ilyen. Célszerűbb azt használni, már csak azért is, mert így egységesebb lesz a programunk más Windows-os alkalmazásokkal.

Ahhoz, hogy ezt az ablakot meg tudjuk nyitni a SHBrowseForFolder függvényt kell meghívnunk. Ez a függvény egyetlen paramétert vár, amely TBrowseInfo rekord típusú.

Mielőtt a fenti függvényt meghívnánk a TBrowseInfo változónkat fel kell tölteni a megfelelő értékekkel.

Ennek a rekordnak a hwndOwner mezőjébe kell megadnunk annak a Form-nak az azonosítóját, mely meghívja az ablakot.

Az lpszTitle mezőbe egy tetszőleges szöveget írhatunk. Ez fog megjelenni a dialóg ablakon fejléc szövegként.

A pidlRoot mezőbe kell megadnunk, hogy mi legyen az az alkönyvtár, ahonnan kezdve látszódjon a könyvtár szerkezet hierarchiája. Ehhez fel kell használnunk azt a függvényt, mely egy sztringből egy PIDL típust készít. Mivel ez a mező ilyen típusú értéket vár, így nem adhatnánk csak egyszerűen értékül a kezdő könyvtárunkat tartalmazó sztringet.

Az ulFlags mezőbe beállított BIF_RETURNONLYFSDIRS konstans garantálni fogja, hogy a felhasználó csak könyvtárat tud kiválasztani a megnyíló ablakból.

Ezek után már meghívhatjuk a SHBrowseForFolder függvényt. Az ablak bezárása után a legfontosabb kérdésünk az lesz, hogy mit is választott a felhasználó. A SHGetPathFromIDList függvény egy átmeneti pufferbe helyezi a SHBrowseForFolder által szolgáltatott értékből a választott könyvtár elérési útvonalát.

Végezetül ne felejtsük el meghívni az ILFree függvényt, mely az ILCreateFromPath függvény által lefoglalt memória területet szabadítja fel.

Ezt a rövid kódrészletet beillesztve a programunkba bármikor bekérhetünk a felhasználótól egy tetszőleges alkönyvtárat.

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