Hallo hathor,
Danke für deinen Hinweis!
Wie gesagt in der Registry steht der aktuelle Wert, andere Programme bekommen auch den aktuellen wert
nur die Dienste oder auch der Dienstemanager (?) bekommen nicht den aktuellen PATH.
Ist das so vielleicht gewollt von Windows? Um laufende Dienste nicht einen anderen Pfad unterzumogeln?
Nach Neustart ist alles ok, aber dass will ich ja eben vermeiden!
Kann man evtl. den Dienstemanager bzw. den Prozess der die Dienste startet neu "durchstarten"?
So sieht mein Delphi-Code aus
Delphi-Quellcode:
SetSystemWideEnvironmentVariable (eoSystem, 'PATH', 'meinpfad');
SetGlobalEnvironment('PATH', 'meinpfad', false);
Delphi-Quellcode:
procedure SetSystemWideEnvironmentVariable (aOwner: tEnviromentOwner; aName, aValue: String);
Var
dwResult: DWORD;
Reg: TRegistry;
Begin
Reg := TRegistry.Create;
With Reg, cEnviromentOwnerRegPlace [aOwner] Do
Try
RootKey := Root;
OpenKey (Key, False);
WriteExpandString (aName, aValue);
SendMessageTimeout (
HWND_BROADCAST, WM_SETTINGCHANGE,
0, lParam (pChar ('Environment')),
SMTO_ABORTIFHUNG, 5000, dwResult
);
Finally
Free
End;
End;
{*********************************************}
{ Set Global Environment Function }
{ Coder : Kingron,2002.8.6 }
{ Bug Report : [email]Kingron@163.net[/email] }
{ Test OK For Windows 2000 Advance Server }
{ Parameter: }
{ Name : environment variable name }
{ Value: environment variable Value }
{ Ex: SetGlobalEnvironment('MyVar','OK') }
{*********************************************}
function SetGlobalEnvironment(const Name, Value: string;
const User: Boolean = True): Boolean;
resourcestring
REG_MACHINE_LOCATION = 'System\CurrentControlSet\Control\Session Manager\Environment';
REG_USER_LOCATION = 'Environment';
begin
with TRegistry.Create do
try
if User then { User Environment Variable }
Result := OpenKey(REG_USER_LOCATION, True)
else { System Environment Variable }
begin
RootKey := HKEY_LOCAL_MACHINE;
Result := OpenKey(REG_MACHINE_LOCATION, True);
end;
if Result then
begin
WriteString(Name, Value); { Write Registry for Global Environment }
{ Update Current Process Environment Variable }
SetEnvironmentVariable(PChar(Name), PChar(Value));
{ Send Message To All Top Window for Refresh }
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, Integer(PChar('Environment')));
end;
finally
Free;
end;
end; { SetGlobalEnvironment }