6
votes

Comment ajouter une variable d'environnement en C ++?

Y a-t-il quelque chose que je peux ajouter une variable d'environnement sous Windows via C ++?

Ils doivent être ajoutés dans "Mes ordinateur-> Propriétés-> Variables de l'environnement Advanced-> Environnement"

merci


3 commentaires

Dupliqué possible de Ajout de manière programmée d'un répertoire à la variable d'environnement de chemin Windows


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).


6 Réponses :


0
votes

10
votes

de MSDN :

ajouter ou modifier par programme Variables d'environnement système, ajoutez-les à la HKEY_LOCAL_MACHINE \ System \ CurrentControlSet \ Control \ Session Manager \ Environnement Clé de registre, puis Diffuser un wm_settingchange message avec lparam défini sur la chaîne "Environnement". Ceci permet applications, telles que la coquille, à Ramassez vos mises à jour ...


3 commentaires

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?



3
votes

La seule façon dont je sais est via le registre.

indice, les variables globales sont dans HKLM \ System \ CurrentControlset \ Control \ Session Manager \ Environnement et celles de chaque utilisateur dans HKEY_USERS \ * \ ENVIRONNEMENT , Où < code> * désigne le SID de l'utilisateur.

bonne chance.


1 commentaires

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 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.



-1
votes

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.

http://msdn.microsoft.com/en-us/library /96xafkes.aspx


7 commentaires

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 de ce processus, le cas échéant. Il n'a pas de permanence.



1
votes

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;
}


0 commentaires

0
votes
#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;
}

1 commentaires

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.