Newsgroup: it.comp.lang.delphi
Titolo: Cartella Documenti

Per sapere dove registrare i dati della mia applicazione, avevo bisogno di 
identificare il percorso della cartella Documenti con una funzione che 
prescindesse dalla versione di Windows. Ho trovato due soluzioni gi� pronte, 
ma non ne capisco la differenza. Qualcuno � in grado di dirmi almeno quale � 
pi� opportuno adottare?
Prima soluzione:
 function GetDocFolder: string;
 var
    r: Bool;
    path: array[0..Max_Path] of Char;
 begin
    r := ShGetSpecialFolderPath(0, path, CSIDL_Personal, False) ;
    if not r then raise Exception.Create('Could not find MyDocuments folder 
location.') ;
    Result := Path;
 end;
 
Seconda soluzione:
function GetDocFolder: string;
var Allocator: IMalloc;
    SpecialDir: PItemIdList;
    FBuf: array[0..MAX_PATH] of Char;
begin
  if SHGetMalloc(Allocator) = NOERROR then
  begin
    SHGetSpecialFolderLocation(Handle, CSIDL_PERSONAL, SpecialDir);
    SHGetPathFromIDList(SpecialDir, @FBuf[0]);
    Allocator.Free(SpecialDir);
    Result := string(FBuf);
  end;
end;
 
 

 piï¿½ opportuno adottare?
 
ciao.
 
Hai gia' provato a vedere su MSDN che differenze ci sono tra le funzioni
che indichi? 
 
ciao
Giacomo
 
 
 

SHGetSpecialFolderLocation ritorna il percorso di una cartella speciale 
in maniera "pura", mentre la seconda passa per le API di IE (dalla 
versione 4 in poi) ed il file ShFolder.dll DEVE essere presente.
Un consiglio? Usa la seconda che funziona benissimo da Windows 95 a 
Windows 8.
 
Per la cronaca usa una funzione tipo questa con i controlli di errore 
inseriti:
 
Function SelezionaCartellaParticolare(Handle   : HWND;
                                       Cartella : Integer) : String;
var
   pidlBrowse     : PItemIDList;
   pszPath        : array[0..MAX_PATH] of char;
   ppMalloc       : IMalloc;
   S              : String;
begin
   CoInitialize(Nil);
   CoGetMalloc(1, ppMalloc);
 
   S  := '';
 
   If SHGetSpecialFolderLocation(Handle, Cartella, pidlBrowse) = NOERROR 
Then
      try
       if (pidlBrowse <> nil) then
          begin
            SHGetPathFromIDList(pidlBrowse, @pszPath);
            S := StrPas(pszPath);
          end;
       finally
       end;
 
   ppMalloc.Free(pidlBrowse);
   CoUninitialize;
 
   Result := S;
end;


faccio un copia/incolla...
 
 
 
uses
...ShlObj...
 
var
SFolder: pItemIDList;
SpecialPath: array[0..MAX_PATH] of Char;
begin
	SHGetSpecialFolderLocation(Form1.Handle, CSIDL_STARTUP, SFolder);
	SHGetPathFromIDList(SFolder, SpecialPath);
  Label1.Caption := StrPas(SpecialPath);
end;
 
Other folders :
CSIDL_BITBUCKET
CSIDL_CONTROLS
CSIDL_DESKTOP
CSIDL_DESKTOPDIRECTORY
CSIDL_DRIVES
CSIDL_FONTS
CSIDL_NETHOOD
CSIDL_NETWORK
CSIDL_PERSONAL
CSIDL_PRINTERS
CSIDL_PROGRAMS
CSIDL_RECENT
CSIDL_SENDTO
CSIDL_STARTMENU
CSIDL_STARTUP
CSIDL_TEMPLATES
 
 
Ciao
Andrea

 ha scritto nel messaggio 
news:kfdodu$fu8$1...@nnrp-beta.newsland.it...

Ho capito bene ? Il consiglio è stato: non usare nè la prima nè la seconda 
funzione, ma una funzione tipo questa sopra !
Anzi, per me che non so distinguere l'una dall'altra, prenderei come 
consiglio di usare esattamente la funzione scritta sopra.
Se non ho capito bene, ditemelo per favore ..
 

Dicevo solamente che se vuoi la compatibilit� piena usa 
SHGetSpecialFolderLocation ma l'implementazione che avevi poteva 
generare un runtimeerror o un direttorio non valido se il secondo 
parametro passato a SHGetSpecialFolderLocation non era tra la lista dei 
conosciuti dal sistema; in oltre non era specificato da dove prendeva 
l'handle usato e l' implementazione non era generica e valida per tutte 
le possibili cartelle "speciali" che ti elenco (tanto per conoscenza) 
con i relativi valori:
 
ps. l'handle da passare � l'handle della finstre attiva o dell'applicazione
 
   CSIDL_DESKTOP             = $0000;         // Desktop
   CSUDL_INTERNET            = $0001;         // Internet
   CSIDL_PROGRAMS            = $0002;         // Programmi
   CSIDL_CONTROLS            = $0003;         // Controlli
   CSIDL_PRINTERS            = $0004;         // Stampanti
   CSIDL_PERSONAL            = $0005;         // Personali
   CSIDL_FAVORITES           = $0006;         // Preferiti
   CSIDL_STARTUP             = $0007;         // Esecuzione automatica
   CSIDL_RECENT              = $0008;         // Recenti
   CSIDL_SENDTO              = $0009;         // Invia a...
   CSIDL_BITBUCKET           = $000A;         // Cestino
   CSIDL_STARTMENU           = $000B;         // Start menu
   CSIDL_MYDOCUMENTS         = $000C;         // Miei documenti
   CSIDL_MYMUSIC             = $000D;         // Mia musica
   CSIDL_MYVIDEO             = $000E;         // Miei video
   CSIDL_DESKTOPDIRECTORY    = $0010;         // Desktop Directory
   CSIDL_DRIVES              = $0011;         // Driver
   CSIDL_NETWORK             = $0012;         // Rete
   CSIDL_NETHOOD             = $0013;         // Risorse di rete
   CSIDL_FONTS               = $0014;         // Font
   CSIDL_TEMPLATES           = $0015;         // Nuovo...
   CSIDL_AvvioAll            = $0016;         // Men� avvio 
    (All user)
   CSIDL_ProgrammiAll        = $0017;         // Programmi 
    (All user)
   CSIDL_StartupAll          = $0018;         // Esecuzione automatica 
    (All user)
   CSIDL_DesktopAll          = $0019;         // Desktop 
    (All user)
   CSIDL_AppData             = $001A;         // Dati applicazioni
   CSIDL_PRINTHOOD           = $001B;         // Coda di stampa
   CSIDL_LOCAL_APPDATA       = $001C;         // dati applicazioni
   CSIDL_ALTSTARTUP          = $001D;         // Startup
   CSIDL_COMMON_ALTSTARTUP   = $001E;         // Startup 
    (All user)
   CSIDL_PreferitiAll        = $001F;         // Preferiti 
    (All user)
   CSIDL_INTERNETTemp        = $0020;         // Temporanei Internet
   CSIDL_Cookies             = $0021;         // Cookies
   CSIDL_Cronologia          = $0022;         // Cronologia
   CSIDL_AppDataAll          = $0023;         // Dati applicazioni 
    (All user)
   CSIDL_WinDir              = $0024;         // WinDir
   CSIDL_SysDir              = $0025;         // SysDir
   CSIDL_IstPrograms         = $0026;         // Istallazione Programmi
   CSIDL_Documenti           = $0027;         // Documenti
   CSIDL_Administrator       = $0028;         // Administrator
   CSIDL_Sys32Dir            = $0029;         // Sys32Dir
   CSIDL_PROGRAMFILESX86     = $002A;         // Programmi 64 bit
   CSIDL_FileComuni          = $002B;         // File Comuni
   CSIDL_PROGRAMFILES86All   = $002C;         // Programmi 64 bit 
    (All user)
   CSIDL_ModelliAll          = $002D;         // Modelli 
    (All user)
   CSIDL_DocumentiAll        = $002E;         // Documenti 
    (All user)
   CSIDL_AmministrazioneAll  = $002F;         // Strumenti 
amministrazione (All user)
   CSIDL_Accessori           = $0030;         // Accessori
   CSIDL_CONNECTIONS         = $0031;         // Connessioni
   CSIDL_COMMON_MUSIC        = $0035;         // Musica comune
   CSIDL_COMMON_PICTURES     = $0036;         // Immagini comuni
   CSIDL_COMMON_VIDEO        = $0037;         // Video comuni
   CSIDL_RESOURCES           = $0038;         // Risorse
   CSIDL_RESOURCES_LOCALIZED = $0039;         // Risorse x lingua
   CSIDL_COMMON_OEM_LINKS    = $003A;         // Link OEM
   CSIDL_CDBURN_AREA         = $003B;         // Masterizzazione
   CSIDL_COMPUTERSNEARME     = $003D;         // Risorse computer
   CSIDL_PROFILES            = $003E;         // Profili
 

   CSIDL_DESKTOP             = $0000;         // Desktop
Ho provato la tua funzione e va bene e quindi userò questa. Grazie