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:
- programy i tak nie załapują "aluzji" - trzeba je zrestartować, żeby zrozumiały
- 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.
- 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".