Meilleure manière de multiplier les plates-formes pour obtenir la version du système d’exploitation en C ++

Hé, je suis un peu nouveau en C ++ et j’écris un programme simple. Mon programme utilisera certains dossiers dans


Chemin de Windows 7: C: \ Users \% username% \ Appdata \ Local …

Chemin d’access Windows XP: C: \ Documents and Settings \% nom_utilisateur% \ Local Settings \ Application Data …

Unix: / home /% username% /. Hiddenfolder / …


Maintenant, le problème est Windows. Dans mon fichier d’en-tête, je peux faire une belle

#ifdef _WIN32

pour se différencier des versions Windows et Unix du programme, mais pendant l’exécution, je dois trouver si l’utilisateur utilise XP ou Vista / 7 pour définir un chemin correct. Y a-t-il un moyen standard de le faire?

Vous n’avez pas besoin de la version du système d’exploitation.

Sur * nixes (bien sur sous Linux et OSX bien sûr, mais devrait l’être aussi sur d’autres), vous pouvez utiliser la variable d’environnement HOME . Sous Windows, vous devez (oui, vous devez le faire , car les chemins peuvent être remappés / localisés et SHGetFolderPath dur est un bon moyen d’avoir plus de travail que nécessaire), utilisez la fonction SHGetFolderPath (elle est déconseillée, mais elle ne va et plus récent SHGetKnownFolderPath est> = Vista), par exemple

 TCHAR buffer[MAX_PATH]; HRESULT res = SHGetFolderPath( NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, buffer ); if (SUCCEEDED(res)) { // ... } 

La détection de version n’est ni nécessaire ni suffisante, car ces parameters peuvent être modifiés par défaut. Utilisez SHGetKnownFolderPath(FOLDERID_RoamingAppData, ...) .

Ces valeurs sont des variables d’environnement. Vous regardez soit% appdata% ou $ HOME / .app (pas sûr de la méthode MAC, ils peuvent avoir des “packages”). Étant donné que vous devez savoir quelle est votre cible au moment de la compilation (win vs. other), vous pouvez savoir quelle variable d’environnement rechercher. Utilisez ensuite getenv pour récupérer la valeur.

vous pouvez utiliser WINVER pour détecter la version de Windows