Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1482 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1045121
maxmoi_la
Posté le 12-04-2005 à 23:33:33  profilanswer
 

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
mood
Publicité
Posté le 12-04-2005 à 23:33:33  profilanswer
 

n°1048089
maxmoi_la
Posté le 14-04-2005 à 22:22:10  profilanswer
 

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

n°1048175
HelloWorld
Salut tout le monde!
Posté le 15-04-2005 à 00:25:49  profilanswer
 

Pourquoi tu donnes pas la solution directement :sarcastic:


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1048246
cricri_
Posté le 15-04-2005 à 08:28:42  profilanswer
 

+1 ;)

n°1048632
maxmoi_la
Posté le 15-04-2005 à 13:46:28  profilanswer
 

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.

n°1048745
HelloWorld
Salut tout le monde!
Posté le 15-04-2005 à 15:03:04  profilanswer
 

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
n°1048759
babar9160
Fan d'Ada et de Perl...
Posté le 15-04-2005 à 15:10:19  profilanswer
 

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

n°1049121
maxmoi_la
Posté le 15-04-2005 à 19:48:33  profilanswer
 

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 ?

n°1049141
maxmoi_la
Posté le 15-04-2005 à 20:14:13  profilanswer
 

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

n°1049444
cricri_
Posté le 16-04-2005 à 08:21:14  profilanswer
 

Donc comment faut-il faire ?

mood
Publicité
Posté le 16-04-2005 à 08:21:14  profilanswer
 

n°1049538
bjone
Insert booze to continue
Posté le 16-04-2005 à 12:22:34  profilanswer
 

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 ?

n°1049703
maxmoi_la
Posté le 16-04-2005 à 15:35:03  profilanswer
 

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


n°1049733
cricri_
Posté le 16-04-2005 à 16:07:58  profilanswer
 

Merci ;)

n°1049776
HelloWorld
Salut tout le monde!
Posté le 16-04-2005 à 16:45:58  profilanswer
 

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
n°1050305
maxmoi_la
Posté le 17-04-2005 à 21:16:20  profilanswer
 

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.

n°1050359
bjone
Insert booze to continue
Posté le 17-04-2005 à 22:51:03  profilanswer
 

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

n°1051244
HelloWorld
Salut tout le monde!
Posté le 18-04-2005 à 19:36:34  profilanswer
 

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
n°1051526
maxmoi_la
Posté le 18-04-2005 à 23:10:37  profilanswer
 

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
n°1051573
maxmoi_la
Posté le 18-04-2005 à 23:36:23  profilanswer
 

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
n°1051610
bjone
Insert booze to continue
Posté le 18-04-2005 à 23:58:15  profilanswer
 

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

n°1051650
HelloWorld
Salut tout le monde!
Posté le 19-04-2005 à 00:26:24  profilanswer
 

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


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1051662
maxmoi_la
Posté le 19-04-2005 à 00:36:24  profilanswer
 

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:  
 

n°1051802
bjone
Insert booze to continue
Posté le 19-04-2005 à 09:52:25  profilanswer
 

bon ça va alors tu est excusé :D

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
Appeler une variable PHP dans un code JSRecordset.find + variable...Cmt faire???
debutant : Affichage variable dans url- problème d'accentsA partir d'une class changer la variable d'une aplet et la rafraichir
SQL Server & Access 2000 db monitoringSQLDMO - SQL Serveur 2000
[Resolu] Asp/Java script pb de variableVariable dans une macro ?
JSTL - afficher html dans une variableCharger une espece de variable au démarrage avec php.ini : possbile ?
Plus de sujets relatifs à : Setter une variable d'environment pour tous les processus.(XP/2000)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR