Setter une variable d'environment pour tous les processus.(XP/2000)

Setter une variable d'environment pour tous les processus.(XP/2000) - C++ - Programmation

Marsh Posté le 12-04-2005 à 23:33:33    

Sur XP/2000, j'aimerai setter une variable d'environment pour tous les processus depuis un porgramme. Tel qu'il est possible de le faire depuis le panneau de configuration->system->avancé->variable d'env...
 
L'appel de la fonction SetEnvironmentVariable ne me convient pas puisque elle affecte uniquement le processus courent ainsi que ses enfants.
 
modifier le contenu du registre à l'adresse suivante ne me convient pas, car je veux faire ces modifications sans rebooter ma machine.
'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment'


Message édité par maxmoi_la le 12-04-2005 à 23:34:19
Reply

Marsh Posté le 12-04-2005 à 23:33:33   

Reply

Marsh Posté le 14-04-2005 à 22:22:10    

Voila, j'ai trouvé la réponse à mon problème, si il y a des interessé qu'il me le fasse savoir. :kaola:

Reply

Marsh Posté le 15-04-2005 à 00:25:49    

Pourquoi tu donnes pas la solution directement :sarcastic:


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 15-04-2005 à 08:28:42    

+1 ;)

Reply

Marsh Posté le 15-04-2005 à 13:46:28    

HelloWorld a écrit :

Pourquoi tu donnes pas la solution directement :sarcastic:


 
Parce que sur ce forum, lorsque j'ouvre la discussion sur un probleme, il n'y a jamais personne pour me répondre, par contre pour faire des polimiques et critiquer, il y a toujours quelqu'un.

Reply

Marsh Posté le 15-04-2005 à 15:03:04    

P'tet que tu poses mal les questions, ou que personne ne sait. Et si personne ne sait, ça fait avancer le schmilblick de donner la solution...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 15-04-2005 à 15:10:19    

Et en utilisant la fonction  
 
system(machaine);
 
ou machaine est une "string" contenant : SET NomVar....
 
Je sais pas si je m'exprime bien mais bon... Moi je le ferais comme ça ;)

Reply

Marsh Posté le 15-04-2005 à 19:48:33    

HelloWorld a écrit :

P'tet que tu poses mal les questions, ou que personne ne sait. Et si personne ne sait, ça fait avancer le schmilblick de donner la solution...


 
Est- ce que tu as compris ma question ?

Reply

Marsh Posté le 15-04-2005 à 20:14:13    

babar9160 a écrit :

Et en utilisant la fonction  
 
system(machaine);
 
ou machaine est une "string" contenant : SET NomVar....
 
Je sais pas si je m'exprime bien mais bon... Moi je le ferais comme ça ;)


 
Salut Babar, en aucun cas ta solution fonctionnera, ce que je veux comme resultat, c'est le meme resultat que lorsque tu vas dans "Panneau de configuration", "Système", tab "Avancé", bouton "Variable d'environment".
 

Reply

Marsh Posté le 16-04-2005 à 08:21:14    

Donc comment faut-il faire ?

Reply

Marsh Posté le 16-04-2005 à 08:21:14   

Reply

Marsh Posté le 16-04-2005 à 12:22:34    

bah fo énumérer les process et y doit bien y avoir une API qui permet de changer les variables d'environnement d'un process donné.
 
je vois un peu ta solution, mais si le process a déjà récupéré  les variables d'environnement qui l'interressait, le changement changera rien non ?

Reply

Marsh Posté le 16-04-2005 à 15:35:03    

Pas besoin de chercher le processus, que de toute facon on ne connais pas son nom..
 
En faites sans le savoir ma réponse était compris dans la question.
 
Il faut setter la variable souhaitée dans  
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
ou selon votre preference dans
HKEY_CURRENT_USER\Environment
 
Ensuite appeler la fonction suivante avec les parametres suivants.
 

Code :
  1. const int timeout = 1000;
  2. DWORD result;
  3. SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
  4.     (LPARAM)"Environment",
  5.     SMTO_BLOCK | SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG,
  6.     timeout, &result);


 
 
 
Voila pour ceux qui sont interesser voici un petit programme de test, qui prouve mes dires
c'est un programme Kleenex, SVP, ne le réeutiliser pas à moins de lui faire faire un gros refactoring. (comme dirais qqun, c'est du C+, pas du C++)
 

Code :
  1. #include <windows.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. // programe compatible avec VC 5.0
  6. #ifndef SMTO_NOTIMEOUTIFNOTHUNG
  7. #define SMTO_NOTIMEOUTIFNOTHUNG   0x0008
  8. #endif
  9. void help(const char* cmd)
  10. {
  11.    const char* p = strrchr(cmd, '\\');
  12.    if (p == NULL)
  13.       p = cmd;
  14.    else
  15.       p++;
  16.    printf("USAGE\n" );
  17.    printf("  %s [/U|/S] [/V] <variableName> [variableValue]\n", p);
  18.    printf("  %s [/D] [/U|/S] [/V] <variableName>\n", p);
  19.    printf("\n" );
  20.    printf("DESCRIPTION\n" );
  21.    printf("  /U   Set USER environment variable (this is the default).\n" );
  22.    printf("  /S   Set SYSTEM environment variable.\n" );
  23.    printf("  /V   Verbose mode.\n" );
  24.    printf("  /D   Delete environment variable.\n" );
  25. }
  26. class Commande
  27. {
  28.    const char* name;
  29.    const char* value;
  30.    bool setUser;
  31.    bool deleteMode;
  32.    bool verbose;
  33. public:
  34.    Commande() : name(NULL), value(NULL), setUser(true),
  35.                 deleteMode(false), verbose(false)
  36.    {
  37.    }
  38.    void load(int argc, char* argv[])
  39.    {
  40.       int nameCount = 0;
  41.       for(int i = 1; i < argc; i++)
  42.       {
  43.          if (argv[i][0] == '/' && argv[i][2] == '\0')
  44.          {
  45.             int c = argv[i][1];
  46.             if ('a' <= c && c <= 'z')
  47.                c += 'A' - 'a';
  48.             switch(c)
  49.             {
  50.             case 'U':
  51.                setUser = true;
  52.                break;
  53.             case 'S':
  54.                setUser = false;
  55.                break;
  56.             case 'V':
  57.                verbose = true;
  58.                break;
  59.             case 'D':
  60.                deleteMode = true;
  61.                break;
  62.             default:
  63.                fprintf(stderr, "Invalid argument: %s\n", argv[i]);
  64.             }
  65.          }
  66.          else if (nameCount == 0)
  67.          {
  68.             name = argv[i];
  69.             nameCount++;
  70.          }
  71.          else if (nameCount == 1)
  72.          {
  73.             value = argv[i];
  74.             nameCount++;
  75.          }
  76.          else
  77.          {
  78.             fprintf(stderr, "Invalid argument: %s\n", argv[i]);
  79.          }
  80.       }
  81.       verif();
  82.    }
  83.    void verif()
  84.    {
  85.       if (name == NULL || !deleteMode && value == NULL)
  86.       {
  87.          fprintf(stderr, "Missing one or more arguments\n" );
  88.          exit(1);
  89.       }
  90.    }
  91.    HKEY getRootKey() const
  92.    {
  93.       HKEY hKey;
  94.       if (setUser)
  95.          hKey = HKEY_CURRENT_USER;
  96.       else
  97.          hKey = HKEY_LOCAL_MACHINE;
  98.       return hKey;
  99.    }
  100.    const char* getRegSubPath() const
  101.    {
  102.       const char* subPath;
  103.       if (setUser)
  104.          subPath = "Environment";
  105.       else
  106.          subPath = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment";
  107.       return subPath;
  108.    }
  109.    inline bool isDeleteMode() const
  110.    {
  111.       return deleteMode;
  112.    }
  113.    inline const char* getName() const
  114.    {
  115.       return name;
  116.    }
  117.      
  118.    inline const char* getValue() const
  119.    {
  120.       return value;
  121.    }
  122. };
  123. void setEnvironment(const Commande* cmd)
  124. {
  125.    HKEY hKey = NULL;
  126.    bool isOk;
  127.    DWORD err = RegOpenKeyEx(cmd->getRootKey(), cmd->getRegSubPath(), 0, KEY_ALL_ACCESS,
  128.       &hKey);
  129.    if (err == ERROR_SUCCESS)
  130.    {
  131.       if (cmd->isDeleteMode())
  132.       {
  133.          err = RegDeleteValue(hKey, cmd->getName());
  134.       }
  135.       else
  136.       {
  137.          err = RegSetValueEx(hKey, cmd->getName(), 0, REG_EXPAND_SZ,
  138.             (const UCHAR*)cmd->getValue(), strlen(cmd->getName()) + 1);
  139.       }
  140.    }
  141.    if (hKey != NULL)
  142.    {
  143.       RegCloseKey(hKey);
  144.    }
  145.    if (err != ERROR_SUCCESS)
  146.    {
  147.       LPVOID lpMsgBuf;
  148.       FormatMessage(
  149.          FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
  150.          NULL,
  151.          err,
  152.          MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  153.          (LPTSTR) &lpMsgBuf,
  154.          0,
  155.          NULL);
  156.       fprintf(stderr, "error(%d): %s\n", err, lpMsgBuf);
  157.       // Free the buffer.
  158.       LocalFree( lpMsgBuf );
  159.       exit(2);
  160.    }
  161. }
  162. int main(int argc, char* argv[])
  163. {
  164.    Commande cmd;
  165.    cmd.load(argc, argv);
  166.    setEnvironment(&cmd);
  167.    DWORD result = 0;
  168.    const int timeout = 1000;
  169.    SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
  170.       (LPARAM)"Environment",
  171.       SMTO_BLOCK | SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG,
  172.       timeout, &result);
  173.    return 0;
  174. }


Reply

Marsh Posté le 16-04-2005 à 16:07:58    

Merci ;)

Reply

Marsh Posté le 16-04-2005 à 16:45:58    

maxmoi_la a écrit :

Est- ce que tu as compris ma question ?


Moi j'avais compris que tu voulais changer les variables d'env des process en cours d'exécution.
 
Note que les variables d'env persistantes sont définies dans autoexec.bat sous Win9x/Me.
 


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 17-04-2005 à 21:16:20    

HelloWorld a écrit :

Moi j'avais compris que tu voulais changer les variables d'env des process en cours d'exécution.
 
Note que les variables d'env persistantes sont définies dans autoexec.bat sous Win9x/Me.


 
Ce que je veux dire, c'est que si quelque ne comprend pas ce que je dis ca peut arriver, mais si qqun comprend partiellement la question et qu'il se sent apte à répondre, il faut pas qu'il se gene dans demander +. C'est pas grave si qqun dit une connerie, au moins ca fait avancer le schimili... schmilili... le schmilbick.
 
Mais en general je me veille de decrire suffisament bien un probleme pour qu'on puisse y repondre. C'est pour ca que ca me frustre, que personne n'intervienent.
 
J'aimerrai vous dire merci à tous les persones qui ce sont intéressés à mon problème.

Reply

Marsh Posté le 17-04-2005 à 22:51:03    

en fait c'est meilleur esprit de donner la réponse tout de suite pour archivage dans le forum, même si personne ne semble interressé, que l'approche "si vous me le demandez gentilment je vous dirais comment"....

Reply

Marsh Posté le 18-04-2005 à 19:36:34    

Oui mais bon ici ça reste un forum assez généraliste quand même. Si tu as des questions très pointues, c'est pas le meilleur endroit, d'où mon

Citation :

P'tet que [...] personne ne sait


;)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 18-04-2005 à 23:10:37    

HelloWorld a écrit :

Oui mais bon ici ça reste un forum assez généraliste quand même. Si tu as des questions très pointues, c'est pas le meilleur endroit, d'où mon
;)


 
Pourrais tu stp m'indiquer un Forum ou je peux poser des questions très pointue, comme ca je ne viendrais plus vous embeter avec mes questions très pointue.  :wahoo:


Message édité par maxmoi_la le 18-04-2005 à 23:11:27
Reply

Marsh Posté le 18-04-2005 à 23:36:23    

bjone a écrit :

en fait c'est meilleur esprit de donner la réponse tout de suite pour archivage dans le forum, même si personne ne semble interressé, que l'approche "si vous me le demandez gentilment je vous dirais comment"....


 
Je suis d'accord avec cet esprits, sauf que si je n'avais pas fais ça, ce sujet serrait rester inintéressant et mis aux oubliette, alors que dans le cas présent des personnes sont intervenues et ont permit d'éclaircir certaine incompréhension de la donnée du problème.
 
 
Pour ma part je n'ai aucun intérêt a donner la réponse à des personnes qui on n'ont rien à secouer. Et pas plus d'intérêt à perdre du temps à chercher la réponse sur un forum ou personne ne semble être capable de m'informer, puisque au final, je devrait quand même trouver la réponse pas mes propres moyens.
 
La reflexion à ce faire pour tous membres d'un forum et de savoir si ils prennent du temps pour les autres ?
La reflexion pour moi et de savoir si je me trouve sur le bon Forum ?


Message édité par maxmoi_la le 18-04-2005 à 23:37:30
Reply

Marsh Posté le 18-04-2005 à 23:58:15    

ça arrive que personne ne sache ce que tu souhaites, et si tu arrives à trouver la solution, ce n'est pas une raison pour sortir:
 

Citation :

Voila, j'ai trouvé la réponse à mon problème, si il y a des interessé qu'il me le fasse savoir. :kaola:


avec le :kaola:  
 
moi ça m'est déjà arrivé une ou deux fois de poser une question et de trouver la réponse, ou alors de m'être fait chier pour un truc et de poster juste un topic pour un gars qui ferait une recherche ultérieure.

Reply

Marsh Posté le 19-04-2005 à 00:26:24    

Pour les questions très pointues, faut aller sur les newsgroups (en anglais souvent).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 19-04-2005 à 00:36:24    

bjone a écrit :

moi ça m'est déjà arrivé une ou deux fois de poser une question et de trouver la réponse, ou alors de m'être fait chier pour un truc et de poster juste un topic pour un gars qui ferait une recherche ultérieure.


 
C'est genereux de ta part.
 
Le smiley, c'est pas méchant ca remplace juste le NA! ca change de ceux qui ont toujours le sourir  :pt1cable:  
 

Reply

Marsh Posté le 19-04-2005 à 09:52:25    

bon ça va alors tu est excusé :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed