2016-06-02 24 views
1

Ich benutze Delphi 10 Seattle auf einer Windows7 64bit Maschine. HierWie kann ich eine Umgebungsvariable ändern und andere Apps den Wert anzeigen lassen, ohne mich abzumelden?

ist das Problem:

Um eine Testumgebung für meine Software zu schaffen, habe ich eine kleine Anwendung, die Umgebungsvariablen in der Windows-Registrierung fügt unter

HKEY_CURRENT_USER\Environment 

Ich benutze diese Variablen in die Suchpfade meiner Pakete und des Hauptprojekts, um auch Projekteinstellungen in die Quellcodeverwaltung übernehmen zu können und einfach von Produktion zu Testzweigen usw. zu wechseln ...

Jetzt ist das Problem, dass nach cre Bei der Umgebungsvariable aktualisiert Delphi seinen "internen Systemvariablenspeicher" unter

nicht und das Projekt wird nicht kompiliert.

Selbst der Neustart von Delphi brachte nicht den gewünschten Effekt. Ich musste Windows komplett neu starten, damit es funktioniert.

Gibt es eine Möglichkeit, die Systemvariablen in Delphi innerhalb meiner Anwendung zu aktualisieren? Fehle ich etwas anderes?

Vielen Dank!

+0

Aus Neugier, versuchen Sie, explorer.exe zu töten und neu zu starten - vielleicht Neustart der Shell wird eine Aktualisierung erzwingen. – JosephStyons

+4

Siehe [Wie fügen Sie eine Windows-Umgebungsvariable ohne Neustart hinzu?] (Http://serverfault.com/a/8856). –

+0

Sie sollten die Dokumentation für Umgebungsvariablen lesen, die Ihnen zeigt, wie Sie dies tun. Es fühlt sich eher so an, als ob Sie versuchen, dies rückzuentwickeln. Hast du nach der Dokumentation gesucht? –

Antwort

6

Ich mache etwas ähnliches in meinem Path Compressor in this blog post beschrieben. Die relevante Methode ist diese:

procedure TPathCompressor.NotifyChanges; 
{ Sending a WM_SETTINGCHANGE message to all top level windows. Otherwise the new environment variables 
    will only be visible after logoff/logon. } 
begin 
    {$IFDEF DEBUG} 
    Exit; 
    {$ENDIF} 
    SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, NativeInt(PChar('Environment')), SMTO_ABORTIFHUNG, 5000, nil); 
end; 
+0

Das tut genau das, was es tun soll :) Danke Uwe und danke auch an alle anderen. – rocksteady