Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Forum - Windows
- Ricavare il percorso del Desktop
()
Newbie
Messaggi: Iscritto:
Postato alle 1:00
Giovedì, 01/01/1970
Una cosa di cui mi capita spesso d'aver bisogno è il percorso della cartella del Desktop di Windows. Ho provato a elaborare una via per ricavarla "leggendo" il registro di sistema che vorrei proporre alla vostra attenzione.
Codice sorgente - presumibilmente C#
// le variabili globali nelle quali immazzino il percorso del Desktop
else{// ora e' aperta la chiave che contiene il percorso richiesto
for( i=0, dimBuff=MAX_PATH;
esito!=ERROR_NO_MORE_ITEMS && esito!=-1;
++i, dimBuff=MAX_PATH ){
esito = RegEnumValue(
chiave, i, buff, &dimBuff, 0, NULL, gPd, &gDPd );
if( esito != ERROR_SUCCESS &&
esito != ERROR_MORE_DATA &&
esito != ERROR_NO_MORE_ITEMS ){
*gPd ='\0';
goto uscita;
}
if( lstrcmp(buff,nomeEl)==0 ) esito =-1;
}
}
}
}
uscita:
if( chiave != 0 ){
RegCloseKey( chiave );
chiave =0;
}
return esito;
}
Sul Windows 7 sul quale ho testato il metodo la soluzione funziona, ma mi chiedo se sia un metodo affidabile o se possa essere fonte di disguidi. Chi volesse darci un'occhiata tenga presente che son solito chiamare la funzione una sola volta al momento dell'avvio del programma e memorizzare il percorso del Desktop in una variabile globale per usi futuri.
Posso migliorare qualcosa? Conviene cambiare completamente approccio? Che ne dite?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
()
Newbie
Messaggi: Iscritto:
Postato alle 18:45
Giovedì, 02/10/2014
Ci sono delle ragioni (magari sciocche, non so) almeno per l'ultimo dei goto. Se uso un break al posto dell'ultimo goto esco dal ciclo for più interno ma non da quello più esterno. Siccome il for interno reinizializza i su 0, se torno al for esterno entro in un ciclo infinito (è ben vero che avrei potuto usare un contatore diverso, con una variabile apposita). Questo se ho seguito ragionamenti sensati, e non è detta...
In merito all'usare o non usare SHGetFolderPath(), devo ammettere che ci ho provato, ma probabilmente non sono riuscito a capire bene la documentazione, perché il compilatore continuava a lamentarsi per l'impossibilità di usare quella funzione; un po' piccato, per questo ho di malavoglia elaborato la mia soluzione schizofrenica.
Vedo che hai incluso un "misterioso" header Shlobj.h... magari quello rende il compilatore un po' più "collaborativo", ci proverò. Devo anche collegare qualche libreria? Tipo quando includi gdiplus.h, intendo, e devi dare istruzione al linker di collegare gdiplus.lib.
Certo è che se mi funziona SHGetFolderPath() butto via alla velocità della luce la mia funzione "barocca"! Tre righe di codice sono effettivamente meglio di settanta, e poi c'è il rischio affidabilità che adombravo.
EDIT (qualche minuto dopo):
Uàaaaaa!!! Includendo shlobj.h funziona alla grande. Certo è che se quei buontemponi che han scritto la documentazione nascondono le informazioni sotto al tappeto non è che uno se le può sognare. Grazie mille, da solo avrei continuato a seguire una strada inutilmente tortuosa e probabilmente inaffidabile. SHGetFolderPath() mi sarà senz'altro utile in mille circostanze (anche se su msdn l'hanno etichettata come "deprecated"). Nel cestino la mia funzione "barocca" e spaghettosa.
Ultima modifica effettuata da il 02/10/2014 alle 19:07
Postato originariamente da AldoBaldo: Ci sono delle ragioni (magari sciocche, non so) almeno per l'ultimo dei goto.
Sì, non avevo notato il secondo for e quindi per l'ultimo goto non basta un break ma è necessario una seconda if dopo la for che esegua un altro break. E' comunque meglio del goto.
Per la SHGetFolderPath() è deprecata perché praticamente usata fino ad XP (anche se funzionante).
Da Vista in poi dovresti usare la nuova funzione SHGetKnownFolderPath() in modo simile
Ultima modifica effettuata da nessuno il 02/10/2014 alle 21:56
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
()
Newbie
Messaggi: Iscritto:
Postato alle 21:17
Giovedì, 02/10/2014
Testo quotato
Postato originariamente da nessuno: Da Vista in poi dovresti usare la nuova funzione SHGetKnownFolderPath() in modo simile
Quale sistema operativo usi? Quale versione di compilatore?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
()
Newbie
Messaggi: Iscritto:
Postato alle 22:00
Giovedì, 02/10/2014
Il sistema operativo è Windows 7 Starter.
Il compilatore è il GNU GCC che veniva distribuito nell'installatore di Code::Blocks quando è uscita la versione 13.12 del programma. Il file "leggimi" contenuto nella cartella MinGW dice così:
=== TDM-GCC Compiler Suite for Windows ===
--- GCC 4.6 & 4.7 Series ---
*** Standard MinGW 32-bit Edition ***
Non so quale sdk hai installato ma devi aggiornarlo.
Ad esempio, con VS2010 c'è già installato il 7.0A che va bene, ma puoi scaricarne anche uno più recente ed installarlo per il gcc e c::b ...
Ultima modifica effettuata da nessuno il 02/10/2014 alle 22:09
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità.
()
Newbie
Messaggi: Iscritto:
Postato alle 22:16
Giovedì, 02/10/2014
Ti ringrazio davvero tanto per le dritte. Già indicandomi l'inclusione di shlobj.h mi hai aiutato un sacco (giammai mi sarebbe venuto in mente). Prendo senz'altro in considerazione il tuo suggerimento di cercare versioni più aggiornate di compilatore e sdk windows, anche se sono piuttosto impedito in questo genere di cose (s'era capito?).
Tra l'altro, ho già rimosso la mia funzione spaghettosa dal programma che sto giocando a realizzare e l'ho sostituita secondo le tue indicazioni. Funziona tutto alla grande. Nei prossimi giorni integrerò SHGetFolderPath() anche in un altro paio di progettini coi quali mi sto divertendo.