2010-05-24 20 views

Odpowiedz

41

Użyj SHGetFolderPath z CSIDL_COMMON_APPDATA jako CSIDL.

TCHAR szPath[MAX_PATH]; 
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath))) 
{ 
    //.... 
} 
+0

Przyjemnie, CSIDL_COMMON_APPDATA TO CSIDL, którego szukam. –

+4

Istnieje również nowsza, niekoniecznie bardziej zwarta, SHGetKnownFolderPath. Dostępne w systemie Vista lub nowszym. – OldFart

+2

Chcę również dodać, że istnieje CSIDL_APPDATA, która jest specyficzną dla użytkownika wersją tego. (COMMON_APPDATA jest współdzielona dla wszystkich użytkowników) –

-4

można również odczytać wartość z rejestru

path = HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Folders Shell

klucz = Common AppData

+0

Możliwości, które przypuszczam. –

+9

Nieudokumentowane i podlegające zmianom; Unikaj tego. Jest API, użyj go. –

+2

Należy pamiętać, że status "Z zastrzeżeniem zmiany" może ulec zmianie we wszystkich rzeczach w świecie Win32. – ActiveTrayPrntrTagDataStrDrvr

15

Tylko po to, aby wstawić odpowiedź interjona

  1. Musiałem włączyć shlobj.h, aby użyć SHGetFolderPath.

  2. Często może trzeba odczytać plik z AppData, do tego trzeba użyć funkcji pathAppend (shlwapi.h jest potrzebna do tego) zrobić.

#include <shlwapi.h> 
#pragma comment(lib,"shlwapi.lib") 
#include "shlobj.h" 

TCHAR szPath[MAX_PATH]; 
// Get path for each computer, non-user specific and non-roaming data. 
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath))) 
{ 
    // Append product-specific path 
    PathAppend(szPath, _T("\\My Company\\My Product\\1.0\\")); 
} 

Zobacz here więcej szczegółów.

+1

+1 i uwaga: aby użyć _T ("...") trzeba "#include " – jyz

+0

Powinieneś używać makra 'TEXT()' zamiast makra '_T()' (lub, zatrzymać używanie 'TCHAR' w ogóle - chyba, że ​​naprawdę potrzebujesz obsługi Win9x/ME). '' TEXT() 'jest używane przez Win32 API,' _T() 'jest używane przez bibliotekę wykonawczą C. –

Powiązane problemy