SetEnvironmentVariable()

Für allgemeine Fragen zur Programmierung mit PureBasic.
Hartwerker
Beiträge: 2
Registriert: 01.11.2011 08:53

SetEnvironmentVariable()

Beitrag von Hartwerker »

Hallo Forum,

mit GetEnvironmentVariable("xyz") kann ich den Inhalt von Umgebungsvariablen abfragen,
aber mit SetEnvironmentVariable("xyz", "wert") kann ich den Inhalt nicht ändern!?

Ich habe in der Systemsteuerung (Win XP SP3) eine Umgebungsvariable xyz als Benutzervariable definert,
die ich auslesen kann, aber nicht verädern. :-(

Wenn ich in einer DOS-Box den Befehl "SET xyz" eingebe, dann wird immer der alte
Wert ausgegeben, nicht der den ich im Programm eingegeben habe.
Eine SystemUmgebungsvariable kann ich mit GetEnvironmentVariable(name) erst gar nicht lesen!?

Ich habe die Gruppen schon nach allem Möglichen durchsucht, aber nur das mit der Vererbung
bei Programmaufrufen gefunden.

Habe ich da irgendwas übersehen, oder geht das einfach nicht?

Gruß vom Hertwerker
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: SetEnvironmentVariable()

Beitrag von ts-soft »

Nach dem Start von Windows gelten die Umgebungsvariablen gemäß Systemsteuerung. Wenn Du jetzt eine
Umgebungsvariable änderst, gilt dies für Deinen Process und alle, die von Ihm aus gestartet werden, nicht
für den Rest des Systems! Für eine allg. Gültigkeit ist dies in die Systemsteuerung/Registry einzutragen und
das System neuzustarten oder per BroadcastMessage zu aktualisieren.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: SetEnvironmentVariable()

Beitrag von Danilo »

MSDN hat geschrieben:Calling SetEnvironmentVariable has no effect on the system environment variables.
To programmatically add or modify system environment variables, add them to the
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
registry key, then broadcast a WM_SETTINGCHANGE message with lParam set to the string "Environment".
This allows applications, such as the shell, to pick up your updates.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: SetEnvironmentVariable()

Beitrag von ts-soft »

Dann war meine Aussage aus dem Gedächtnis heraus, sehr genau, bis auf dem Registrykey, den hab ich
natürlich nicht im Hinterkopf :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Hartwerker
Beiträge: 2
Registriert: 01.11.2011 08:53

Re: SetEnvironmentVariable()

Beitrag von Hartwerker »

Danke erst mal für die Info,

in der Hilfe finde ich nichts über WM_SETTINGCHANGE, und bei MSN führt es zu einem
toten Link: <http://msdn.microsoft.com/de-de/library/bb979383.aspx>
Generell sind die MSN-Seiten nicht besonders gut, schon allein die automatische Übersetzung
ins Deutsche! :-(

Gruß Hartwerker
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: SetEnvironmentVariable()

Beitrag von Danilo »

Hartwerker hat geschrieben:Danke erst mal für die Info,

in der Hilfe finde ich nichts über WM_SETTINGCHANGE, und bei MSN führt es zu einem
toten Link: <http://msdn.microsoft.com/de-de/library/bb979383.aspx>
Du mußt nach WM_SETTINGCHANGE in der Suchbox links oben suchen.

Auf der von Dir verlinkten Seite ist eine VB-Funktion PropagateChange(),
die Du mit dem String "Environment" aufrufen mußt, nachdem Du Deine
Umgebungsvariable in der Registrierung eingetragen hast.

Hier das PropagateChange() für PB:

Code: Alles auswählen

Procedure DosCommand(strDosCommand.s,workingDir.s="",Wait=0)
    Protected CloseConsoleWhenDone.s
    ; strDosCommand enthält den "DOS-Befehl" so, wie Sie ihn 
    ; in einem Konsolenfenster eingeben würden: 
    ;
    ; Der Zeilenschalter "/C" bewirkt, dass das Konsolenfenster 
    ; automatisch geschlossen wird, wenn die darin auszuführende 
    ; Aufgabe abgearbeitet wurde:
    If Wait=0
        CloseConsoleWhenDone = " /C "
    EndIf
    ; "DOS-Befehl" definieren... 
    ;strDosBefehl = "Dir c:\*.* | more" 
    ; ... und ausführen: 
    RunProgram(GetEnvironmentVariable("COMSPEC"), CloseConsoleWhenDone + strDosCommand,workingDir.s)
EndProcedure


Procedure PropagateChange(string.s="",timeout.l=5000)
    Protected msg.s
    CompilerIf #PB_Compiler_Unicode
        len = Len(string)
        msg = Space(len)
        If len
            PokeS(@msg,string,len,#PB_Ascii)
        EndIf
    CompilerElse
        msg = string
    CompilerEndIf
    ProcedureReturn SendMessageTimeout_(#HWND_BROADCAST,#WM_SETTINGCHANGE,0,@msg,#SMTO_ABORTIFHUNG,timeout,#Null)
EndProcedure


If OpenConsole()
    DosCommand("Dir c:\*.*","",0)

    SetEnvironmentVariable("HARTWERKER","Hartwerkers Nachricht: cool bleiben!")

    DosCommand("echo %HARTWERKER%")



    If PropagateChange("Environment")    
        PrintN("SendMessageTimeout: OK")
    Else
        PrintN("SendMessageTimeout: FEHLER")
    EndIf

    Input()
EndIf
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten