Modifier une variable environnement user ?

Résolu
cs_chuckboy Messages postés 64 Date d'inscription vendredi 16 septembre 2005 Statut Membre Dernière intervention 31 mars 2009 - 13 oct. 2005 à 20:54
cs_chuckboy Messages postés 64 Date d'inscription vendredi 16 septembre 2005 Statut Membre Dernière intervention 31 mars 2009 - 14 oct. 2005 à 17:26
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 oct. 2005 à 21:02
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++
3
cs_chuckboy Messages postés 64 Date d'inscription vendredi 16 septembre 2005 Statut Membre Dernière intervention 31 mars 2009 1
13 oct. 2005 à 21:11
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 oct. 2005 à 21:17
Passe l'enviroment dans le 7eme param de CreateProcess.

ciao...
BruNews, MVP VC++
0
cs_chuckboy Messages postés 64 Date d'inscription vendredi 16 septembre 2005 Statut Membre Dernière intervention 31 mars 2009 1
13 oct. 2005 à 21:23
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"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 oct. 2005 à 21:40
0
cs_chuckboy Messages postés 64 Date d'inscription vendredi 16 septembre 2005 Statut Membre Dernière intervention 31 mars 2009 1
13 oct. 2005 à 21:47
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 ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 oct. 2005 à 22:01
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++
0
cs_chuckboy Messages postés 64 Date d'inscription vendredi 16 septembre 2005 Statut Membre Dernière intervention 31 mars 2009 1
13 oct. 2005 à 22:06
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 ?
0
cs_chuckboy Messages postés 64 Date d'inscription vendredi 16 septembre 2005 Statut Membre Dernière intervention 31 mars 2009 1
13 oct. 2005 à 22:21
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.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 oct. 2005 à 22:38
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++
0
cs_chuckboy Messages postés 64 Date d'inscription vendredi 16 septembre 2005 Statut Membre Dernière intervention 31 mars 2009 1
13 oct. 2005 à 22:50
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;
}
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 oct. 2005 à 22:55
lpszCurrentVariable = chNewEnv;
if (lstrcpy(lpszCurrentVariable....

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

ciao...
BruNews, MVP VC++
0
cs_chuckboy Messages postés 64 Date d'inscription vendredi 16 septembre 2005 Statut Membre Dernière intervention 31 mars 2009 1
14 oct. 2005 à 17:26
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);
0
Rejoignez-nous