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

3. rész

forráskód letöltése
A cikksorozat előző részeiben 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 ezeknek a rejtett lehetőségeit. A cikksorozat előző részeiben 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 ezeknek a rejtett lehetőségeit.


A múlt héten elkezdett TBrowseDialog komponenst fejlesztjük tovább mostani példaprogramunkban, így mielőtt megnyitná azt, a BrowseDialog.pas-ban található komponenst telepíteni kell a Delphi-be, illetve ha múlt héten ezt már megtette, akkor egyszerűen cserélje le a régit a mostanira.

Az itt leírtaknál feltételezzük, hogy az Olvasó ismeri az előző cikkek tartalmát, mivel az ott leírt információkra építjük ezt a példaprogramot, de ezeket itt már nem ismételjük meg.

Újabb funkciókkal egészítettük ki a komponenst. Például a BrowseDialog képes előre megadott speciális alkönyvtárakban is keresni és nem csak egy általunk megadott elérési útvonalon.

Ehhez létrehozunk egy RootFolder nevű property-t. Itt különféle értékek közül választhatunk.
Ha az rfCustomPath értéket választjuk, akkor továbbra is a CustomPath property-ben megadott elérési útvonalon kezdődik a keresés.

Ha viszont ettől eltérő értéket választunk, akkor a konstansnak megfelelően más és más speciális alkönyvtárban kereshetünk. Így lehetőség nyílik akár arra is, hogy hálózaton tallózzunk, vagy akár egy nyomtató kiválasztását kérjük be a felhasználótól.

Ebben az esetben SHBrowseForFolder hívása előtt mikor a TBrowseInfo struktúrát töltjük ki, akkor a pidlRoot mező értékadásánál először ellenőriznünk kell, hogy rfCustomPath érték van-e a RootFolder property-ben. Ha igen, akkor a CustomPath property-ben lévő alkönyvtárát használjuk fel továbbra is, ha viszont nem, akkor egy speciális alkönyvtárat adunk meg.

Ehhez készítettünk egy RootFolderToCSIDL nevű függvényt, mely a RootFolder nevű property értékéből előállítja a SHGetSpecialFolderLocation függvény számára szükséges értéket.


Létrehoztunk továbbá egy ReturnOnlyFSDirs nevű property-t is. Ezzel szabályozhatjuk, hogy csak alkönyvtárak látszódjanak, vagy esetleg a bennük lévő állományok is.
Ha igaz ez a property, akkor viszont nem látszanak az egyes elemek néhány speciális alkönyvtár esetén. Ilyen például a nyomtatók (RootFolder=rfPrinters), mivel itt nincs további alkönyvtár, az egyes nyomtatók pedig állományoknak felelnek meg. Ilyen esetben ezt a property-t állítsunk mindig hamisra a helyes működés érdekében.


A BrowseForComputer property igazra állításával a felhasználó csupán a hálózaton elérhető számítógépek között tud tallózni. Ez a property sem használható minden speciális könyvtárral együtt.


Ha a StatusEnabled property-t igazra állítjuk, akkor két lehetőségünk van: ha a Status property tartalmaz szöveget, akkor azt kiírjuk a dialóg ablak státusz sorába, ha nem, akkor pedig az aktuálisan kiválasztott alkönyvtár teljes elérési útvonalát íratjuk ki ide.

Amikor a Status property értéke változik, akkor kerül meghívásra a SetStatus eljárás. Itt ha már inicializálva lett a dialóg ablak, akkor annak küldünk a PostMessage függvénnyel egy BFFM_SETSTATUSTEXT üzenetet, paraméterként átadva neki az új státusz sztringet.

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