[WinAPI] Modyfikacja zmiennych środowiskowych "w locie&

0

Jeśli napiszę sobie skrypt .bat to mogę w nim modyfikować zmienne środowiskowe, i ma to natychmiast wpływ na te w "cmd.exe" - w sumie nic dziwnego: plik wsadowy to nie oddzielny proces.

set TEMP=V:\temp
:: wow, zmieniliśmy tempa

Jeśli napiszę sobie program w C i zmienię w nim %TEMP% w jakikolwiek sposób, to odnosi się to tylko do zmiennych dla tego procesu. Jeśli wywołam programik takowy w konsoli, to po jego zakończeniu zmienne środowiskowe będą takie, jak przed jego startem - c**** :|

Na tę chwilę, jeśli chcę grzebać w zmiennych środowiskowych, to modyfikuję rejestr, zmieniając klucze w:

# zmienne systemowe:
HKLM\System\CurrentControlSet\Control\Session Manager\Environment

# zmienne użytkownika:
HKCU\Environment

A żeby towarzystwo załapało, że coś zmieniłem, to wywołuję poniższą funkcję - czyli wysyłam do wszystkich programów komunikat o tym, że ustawienia się zmieniły.

DWORD result;
bool ok = SendMessageTimeout(
	HWND_BROADCAST,
	WM_SETTINGCHANGE,
	(WPARAM)0,
	(LPARAM)"Environment",
	SMTO_NORMAL,
	3000,
	&result
	);

Jakoś to działa, system "się odświeża", ALE:

  1. programy i tak nie załapują "aluzji" - trzeba je zrestartować, żeby zrozumiały
  2. chciałbym zmieniać to w czasie rzeczywistym: już nie mówię że całemu systemowi i wszystkim. Wystarczy żeby się zmieniało w konsoli, w której wywołałem swój program.
  3. coś mniej ingerującego bym chciał - bo teraz zmieniam "na stałe", a ja chciałbym dokładnie ten sam efekt osiągnąć, co polecenie "set" - na chwilę, dla bieżącego "cmd.exe".
0

Użyj funkcji SetEnvironmentVariable, SET właśnie jej używa.
Gdybyś chciał zmienić globalną zmienną (dla wszystkich procesów) to:

  1. Możesz ją zapisać w rejestrze (tam gdzie wspomniałeś) i liczyć na to, że każdy proces odczytuje zmienne środowiskowe z rejestru. Zazwyczaj wygodniej jest wywołać GetEnvironmentVariable, gdzie zmienne są odczytywane z bloku pamięci inicjowanego podczas startu procesu.

  2. Natychmiastowy efekt zyskujesz wywołując SetEnvironmentVariable w kontekście wszystkich uruchomionych procesów - CreateRemoteThread. W praktyce wystarczy zrobić to z explorerem, wtedy każdy uruchomiony przez niego program odziedziczy kopię tych zmiennych.

  3. Punkt 1 plus restart systemu - pomijam.

0

2' - tak, ale problem w tym, ze tylko nowe programy odziedzicza ja.. stare conajwyzej zostana powiadomione i - tak jak ranides powiedzial, w 95% oleja i nie odswieza sobie zcacheowanych sciezek/etc

..z tym to zawsze byla kicha i restart zainteresowanych procesow:| jak ktos zna metode na to, to chetnie rowniez poznam:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1