Y a-t-il quelque chose que je peux ajouter une variable d'environnement sous Windows via C ++? P>
Ils doivent être ajoutés dans "Mes ordinateur-> Propriétés-> Variables de l'environnement Advanced-> Environnement" P>
merci p>
6 Réponses :
de MSDN : P>
ajouter ou modifier par programme Variables d'environnement système, ajoutez-les à la
HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environnement Code> Clé de registre, puis Diffuser un
wm_settingchange code> message avec
lparam code> défini sur la chaîne "Environnement". Ceci permet applications, telles que la coquille, à Ramassez vos mises à jour ... P> blockQuote>
Y a-t-il une autre manière sans utiliser de registre?
@ Code9215: Nope, pas encore, mais si vous en trouvez un, vous devriez écrire une réponse.
Le système est des paramètres globaux. Que diriez-vous d'ajouter des paramètres utilisateur?
La seule façon dont je sais est via le registre. P>
indice, les variables globales sont dans bonne chance. P> HKLM \ System \ CurrentControlset \ Control \ Session Manager \ Environnement et celles de chaque utilisateur dans
HKEY_USERS \ * \ ENVIRONNEMENT CODE>, Où < code> * code> désigne le SID de l'utilisateur. P>
Après une recherche indépendante moi-même qui m'a conduit ici, j'ai trouvé que c'était le mécanisme le plus facile. Rappelez-vous simplement que chaque processus qui existait avant i> vous avez mis à jour la variable d'environnement de chemin peut ne pas répondre, car il se doit au fil du message que vous êtes censé envoyer après la mise à jour. Signification, le changement ne peut s'appliquer qu'aux nouveaux processus.
Les variables d'environnement dans Windows sont stockées dans le registre Windows. Vous pouvez utiliser "System.Environment.setenvironmentVariable" .NET Fonction à cet effet, veuillez consulter la documentation de la fonction au lien ci-dessous. P>
Il veut fixer les variables globalement; Cette fonction ne s'applique qu'au processus en cours.
Je pense que vous n'avez pas lu la documentation de la fonction. La fonction peut définir la variable pour "processus" ou "utilisateur" ou "machine". Vous pouvez le faire au niveau de la machine en passant Targer = EnvironnementVariaBleTarget.machine
C'est une fonction C #; Il demande à propos de C ++.
Ok si vous ne voulez pas accepter, que puis-je dire. Je ne vais pas commenter plus loin. Juste une dernière chose pour votre information. Cette méthode peut être appelée FOM C ++, C #, VB et F # (voir Lien donné pour un code d'échantillon pour toutes les langues). Je conviens que la fonction fait partie du cadre et ne fait pas partie de Win32, mais la question posée n'exige pas cela. La question indique simplement "C ++ sur Windows". Je suppose que vous n'avez pas lu la question avec soin. De toute façon s'amuser !! :)
"C ++ sur Windows" ne peut pas appeler les méthodes .NET. (Peu de personnes utilisent C ++ / CLI)
@Slaks vient de tomber sur ceci. Il y a en fait une fonction C ++ avec le même nom, qui fait la même chose: msdn.microsoft.com/en-us/library/windows/desktop/...
C'est une API Win32 et a le même effet local que je décris ci-dessous. Slaks a raison. Lorsqu'un nouveau processus Windows est créé, il reçoit une copie complète de l'environnement dans son bloc d'environnement de processus, c'est pourquoi un message doit être envoyé après la mise à jour). Cette méthode n'affecte que ce processus local, ou enfants i> de ce processus, le cas échéant. Il n'a pas de permanence.
Voici une implémentation simple (basée sur l'instruction MSDN postée par STE STEELBYTES):
bool SetPermanentEnvironmentVariable(LPCTSTR value, LPCTSTR data) { HKEY hKey; LPCTSTR keyPath = TEXT("System\\CurrentControlSet\\Control\\Session Manager\\Environment"); LSTATUS lOpenStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, keyPath, 0, KEY_ALL_ACCESS, &hKey); if (lOpenStatus == ERROR_SUCCESS) { LSTATUS lSetStatus = RegSetValueEx(hKey, value, 0, REG_SZ,(LPBYTE)data, strlen(data) + 1); RegCloseKey(hKey); if (lSetStatus == ERROR_SUCCESS) { SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_BLOCK, 100, NULL); return true; } } return false; }
#include <iostream> #include <windows.h> #include <cstring> #include "tchar.h" void SetUserVariablePath(){ HKEY hkey; long regOpenResult; const char key_name[] = "Environment"; const char path[]="D:/custom_command"; //new_value path need to update regOpenResult = RegOpenKeyEx(HKEY_CURRENT_USER,key_name, 0, KEY_ALL_ACCESS, &hkey); LPCSTR stuff = "VVS_LOGGING_PATH"; //Variable Name RegSetValueEx(hkey,stuff,0,REG_SZ,(BYTE*) path, strlen(path)); RegCloseKey(hkey); } void GetUserVariablePath(){ static const char path[] = "VVS_LOGGING_PATH" ; //Variable Name static BYTE buffer1[1000000] ; DWORD buffsz1 = sizeof(buffer1) ; { //HKEY_CURRENT_USER\Environment const char key_name[] = "Environment"; HKEY key ; if( RegOpenKeyExA( HKEY_CURRENT_USER, key_name, 0, KEY_QUERY_VALUE, std::addressof(key) ) == 0 && RegQueryValueExA( key, path, nullptr, nullptr, buffer1, std::addressof(buffsz1) ) == 0 ) { std::cout << "The updated value of the user variable is : " << reinterpret_cast<const char*>(buffer1) << '\n' ; } } } int main() { SetUserVariablePath(); GetUserVariablePath(); return 0; }
Bienvenue dans le débordement de pile. Ce serait bien si vous deviez expliquer pourquoi votre réponse est meilleure que celles déjà fournies.
Dupliqué possible de Ajout de manière programmée d'un répertoire à la variable d'environnement de chemin Windows a>
Dupliqué possible de Définir les variables d'environnement locales en C ++
@AAMIR: OP a dit "sous Windows". Votre lien ne le nécessite que pour le processus de course. Voir également la réponse de Felice Pollano qui fait la même hypothèse (imo fausse).