2010-05-24 16 views

Respuesta

41

Usa SHGetFolderPath con CSIDL_COMMON_APPDATA como CSIDL.

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

Agradable, CSIDL_COMMON_APPDATA ES el CSIDL que estoy buscando. –

+4

También está SHGetKnownFolderPath, la más nueva y no necesariamente más elegante. Disponible en Vista o más tarde. – OldFart

+2

También quiero agregar que hay CSIDL_APPDATA que es la versión específica para el usuario de esto. (COMMON_APPDATA se comparte entre todos los usuarios) –

-4

también se puede leer el valor del registro

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

= Common AppData

+0

Do-able, supongo. –

+9

Sin documentar y sujeto a cambios; evitarlo Está la API, úsala. –

+2

Tenga en cuenta que el estado 'Sujeto a cambios' está sujeto a cambios para todas las cosas en el mundo de Win32. – ActiveTrayPrntrTagDataStrDrvr

15

Solo para suplir la respuesta de Interjay

  1. Tuve que incluir shlobj.h para usar SHGetFolderPath.

  2. A menudo, es posible que tenga que leer un archivo de datos de programa, para hacer esto es necesario utilizar la función pathAppend (shlwapi.h se necesita para esto).

#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\\")); 
} 

Ver here para más detalles.

+1

+1 y una nota: para usar _T ("...") debe '#incluir ' – jyz

+0

Debe usar la macro 'TEXT()' en lugar de la macro '_T()' (o, detener usando 'TCHAR' por completo, a menos que realmente necesites soportar Win9x/ME). 'TEXT()' es utilizado por la API de Win32, '_T()' es utilizado por la biblioteca C runtime. –

Cuestiones relacionadas