Modifier une variable environnement user ? [Résolu]

Signaler
Messages postés
64
Date d'inscription
vendredi 16 septembre 2005
Statut
Membre
Dernière intervention
31 mars 2009
-
Messages postés
64
Date d'inscription
vendredi 16 septembre 2005
Statut
Membre
Dernière intervention
31 mars 2009
-
Bonjour

La question est dans le titre !

J'ai une variable d'environnement utilisateur que j'aimerais modifier à partir mon programme comment puis-je faire ?
SSROOT c:\toto

J'ai deja essayer
_putenv("SSROOT",c:\nono");
SetEnvironmentVariable("SSROOT","c:\nono");

thks

13 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
SetEnvironmentVariable doit fonctionner mais juste pour le process appelant.
Si c'est pour tout le system, faut écrire dans la BDR et envoyer unWM_SETTINGCHANGE.

ciao...
BruNews, MVP VC++
Messages postés
64
Date d'inscription
vendredi 16 septembre 2005
Statut
Membre
Dernière intervention
31 mars 2009
1
Ok j'explique plus en details

Mon programme apelle un autre executable creer dans un process et c'est celui ci qui a besoin de cette variable d'environnement.
Je ne veut pas que le changement demeure une fois l'execution du programme terminer.

C'est possible ?

thks
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Passe l'enviroment dans le 7eme param de CreateProcess.

ciao...
BruNews, MVP VC++
Messages postés
64
Date d'inscription
vendredi 16 septembre 2005
Statut
Membre
Dernière intervention
31 mars 2009
1
Voici ma fonction

void LancementProcess(const std::string sCheminComplet,const std::string sNumeroTest)
{
//Change la variable environnement
SetEnvironmentVariable(TEXT("sgmroot"),TEXT("c:\\SGMTEST1\\DEV"));


// Prepare the external script execution via a process


std::string _CommandLine = sCheminComplet + " " + sNumeroTest;


STARTUPINFO _SI;


PROCESS_INFORMATION _PI;


// Connect standard handles


ZeroMemory(&_SI,sizeof(STARTUPINFO));


_SI.cb=sizeof(STARTUPINFO);


_SI.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;


_SI.wShowWindow=SW_HIDE;


_SI.dwFlags=STARTF_USESTDHANDLES;


_SI.hStdInput=NULL;


_SI.hStdOutput=NULL;


_SI.hStdError=NULL;


// Create process and wait for achievement


CreateProcess(NULL, (LPTSTR)_CommandLine.c_str(), NULL, NULL, TRUE, NULL, NULL, NULL, &_SI, &_PI);


DWORD _Result = WaitForSingleObject(_PI.hThread, INFINITE);
}

Je voit pas trop ce que tu veut dire par passer l'Environnement , quoique j'ai bien essayer de lui passer directement "sgmroot=c:\\test1"
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Messages postés
64
Date d'inscription
vendredi 16 septembre 2005
Statut
Membre
Dernière intervention
31 mars 2009
1
Ouais je sais j'avais deja cet exemple le problème est qu'il lui passe l'Argument null , c'est a dire selon msdn le même environnement que la thread qui cree le process , pourtant ca fonctionne pas.


Ce que j'aimerais c'est un exemple pour lui passer directment une variable environnement parce que l'a ca fonctionne reelement pas.

J'aurais tu besoin d'utiliser un WM_SETTINGCHANGE pour que ca fonctionne ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
mais non passe simplement ta variable d'environment dans le 7eme param de CreateProcess, c'est clair non ?
Mets un 2eme ZERO en final de ta variable.

ciao...
BruNews, MVP VC++
Messages postés
64
Date d'inscription
vendredi 16 septembre 2005
Statut
Membre
Dernière intervention
31 mars 2009
1
Desoler , je comprend pas vite vite la.

J'essait comme ca et ca fonctionne pas

Mon process ce creer mais ma variable d'environnement n'est pas la sgmroot=c:\\SGMTEST1\\dev

CreateProcess(NULL, (LPTSTR)_CommandLine.c_str(), NULL, NULL, TRUE, NULL,"sgmroot=c:\\SGMTEST1\\dev", NULL, &_SI, &_PI);

Tu veut dire quoi par mettre un 2eme ZERO en final de ta variable ?
Messages postés
64
Date d'inscription
vendredi 16 septembre 2005
Statut
Membre
Dernière intervention
31 mars 2009
1
Mon probleme viendrait pas du fait que il ya deux type de variable d'environnement , les sytems et les users ?
Ma variable a modifier est une variable user.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Tu as regardé le 1er exemple des 3 fournis à l'URL indiquée plus haut ?
Il y a la mise du second terminateur NULL (qu'on peut largement simplifier) et le passage du param à CreateProcess, tout ce qu'il faut.

ciao...
BruNews, MVP VC++
Messages postés
64
Date d'inscription
vendredi 16 septembre 2005
Statut
Membre
Dernière intervention
31 mars 2009
1
Mais dans cette exemple de msdn justement à koi sert lpszCurrentVariable puisqu'il envoit chNewEnv que lui N'a pourtant pas été modifié.

Y a vraiment de koi que je pige pas !

// Copy environment strings into an environment block.

lpszCurrentVariable = chNewEnv;
if (lstrcpy(lpszCurrentVariable, "MyVersion=2") == NULL)
{
printf("lstrcpy failed (%d)\n", GetLastError());
return FALSE;
}

lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;
if (lstrcpy(lpszCurrentVariable, "MySetting=A") == NULL)
{
printf("lstrcpy failed (%d)\n", GetLastError());
return FALSE;
}

// Terminate the block with a NULL byte.

lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;
*lpszCurrentVariable = '\0';

// Create the child process, specifying a new environment block.

fSuccess = CreateProcess(NULL, "childenv", NULL, NULL, TRUE, 0,
(LPVOID) chNewEnv, // new environment block
NULL, &si, &pi);

if (! fSuccess)
{
printf("CreateProcess failed (%d)\n", GetLastError());
return FALSE;
}
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
lpszCurrentVariable = chNewEnv;
if (lstrcpy(lpszCurrentVariable....

et tu trouves que chNewEnv n'a pas été modifié ???

ciao...
BruNews, MVP VC++
Messages postés
64
Date d'inscription
vendredi 16 septembre 2005
Statut
Membre
Dernière intervention
31 mars 2009
1
Un gros merci à BruNews

J'ai enfin comprit d'ou venait mon probleme , un gros merci pour ton aide mais je me suis enfin rendut compte que la task que je creait au lieu d'hériter des variables d'environnement allais reloader les variables d'environnement.

Ca ma au moin permis de bien comprendre comment ca fonctionne les variable environnement.

Pour mon probleme la solution etait

Changer la variable d'environnement dans le registry
Ensuite faire un refresh à l'aide de la commande :
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0L, (LPARAM) "Environment", SMTO_ABORTIFHUNG, 1, NULL);