Newsgroup: it.comp.lang.visual-basic
Titolo: Cartelle speciali e virtuali

Salve a tutti.
Magari lo sapete già, ma io l'ho scoperto solo oggi e mi pare una grande
cosa. Vi sarà capitato di volere aprire un common dialog su una cartella
virtuale o speciale, ad esempio la cartella virtuale "Risorse di rete" o il
cestino. Intendo dire il campo lpstrInitialDir della struttura OPENFILENAME
per chichiama i common dialog via API o InitDir per chi usa l'ocx o il
controllo ccrp. Chi di voi ha risolto il problema sarà passato attraverso le
varie SHGetSpecialFolderPath, SHGetPathFromIDList,
SHGetSpecialFolderLocation, senza dimenticare CoTaskMemFree alla fine per
liberare la memoria (se già non lo fate, fatelo!). Invece, sia il campo
lpstrInitialDir della struttura OPENFILENAME, sia la proprietà InitDir dei
due ocx che ho nominato, accettano una stringa contenente la GUID della
cartella virtuale o speciale. Se volete aprire sul cestino, basta fare:
CommonDialog1.InitDir = "::{645FF040-5081-101B-9F08-00AA002F954E}"
CommonDialog1.ShowOpen
Se preferite che il folder iniziale sia "Risorse del computer" basta fare:
CommonDialog1.InitDir = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
CommonDialog1.ShowOpen
Se volete aprire su risorse di rete:
CommonDialog1.InitDir = "::{208D2C60-3AEA-1069-A2D7-08002B30309D}"
CommonDialog1.ShowOpen
Altre GUID interessanti (attenzione: non tutte funzionano, come ad esempio
Printers)
Network Neighborhood   {208D2C60-3AEA-1069-A2D7-08002B30309D}
My Computer                {20D04FE0-3AEA-1069-A2D8-08002B30309D}
Control Panel                {21EC2020-3AEA-1069-A2DD-08002B30309D}
Dial-Up Networking        {992CFFA0-F557-101A-88EC-00DD010CCC48}
Printers                        {2227A280-3AEA-1069-A2DE-08002B30309D}
Recycled                      {645FF040-5081-101B-9F08-00AA002F954E}
Directory                      {F3364BA0-65B9-11CE-A9BA-00AA004AE837}
Naturalmente, in altri casi ci vuole per forza tutta quella cosa dei pidl,
SHGetPathFromIDList e compagnia cantante (che non maneggio ancora benissimo,
ma insomma se vi serve fatemi sapere lo stesso, qualcosa tireremo fuori).
Spero che la cosa vi sia stata utile.
Domenico
PS Attenzione: la GUID va inserita tra virgolette, con le graffette e
preceduta da due doppi punti.


Non lo sapevo, ottimo.
Aggiungo una cosa: l'altro giorno, scartabellando nel registry del mio
sistema, ho notato che ci sono anche segnati i path di sistema (mi pare che
ci siano tutti quelli ritornati da SHGetSpecialFolderLocation), date
un'occhiata a:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell
Folders
Anche se probabilmente e' piu' sicuro affidarsi alle API che non leggere i
path dal registry (la posizione potrebbe cambiare in versioni successive di
Windowz), credo sia piu' semplice leggere una stringa dal registry che non
utilizzare le API apposite (SHGetSpecialFolder***).
--
Roal Zanazzi
z...@iol.it

cestino.
------------------------
E-mail
gd...@tin.it
Microdev HomePage
http://micordev.dynip.com
http://www.grisnet.it/microdev/

utilizzare le API apposite (SHGetSpecialFolder***).
Hai ragione, affidarsi alle API è più sicuro, perché il luogo di
registrazione potrebbe cambiare in una prossima versione di Windows. Quello
che intendo dire è che se io leggo una daterminata locazione nel registry
per sapere qual è il path effettivo della cartella documenti poi potrei
avere problemi, ma se uso la GUID problemi non ne avrò mai, nemmeno in
future versioni. Inoltre, l'uso delle GUID effettivamente è più semplice
delle API perché non devi convertire il pidl in path.
Domenico

Edo

non č un link!)
Ottimo. Vado a vedere sul tuo sito se trovo altre cose golose.
Domenico


Non conosco l'algoritmo di creazione del GUID, quindi domando: ma sei
proprio sicuro che i GUID degli oggetti di sistema non cambino con le
versioni di Windows?
Es. in Win95 il pannello di controllo ha lo stesso GUID di Win98 e WinNT?
--
Roal Zanazzi
z...@iol.it

>
