Seite 1 von 1
Wie kann ich die Umgebungsvariablen auslesen?
Verfasst: 22.09.2004 13:21
von mcGeorge
Hallo zusammen,
unter Windowse kann man ja mit "set" Umgebungsvariablen setzen. Wie z.B. die PATH- oder die CLIENTNAME-Variable.
Wie kann ich die Variablen auslesen?

Re: Wie kann ich die Umgebungsvariablen auslesen?
Verfasst: 22.09.2004 13:39
von Kiffi
Verfasst: 22.09.2004 13:41
von AndyMars
Da gibt's API-Funktionen - alles schon da gewesen - im alten Forum
http://www.robsite.de/php/pureboard-arc ... php?t=1643
Edit: Muss immer einer schneller sein?

Das PureAre.net ist natürlich auch immer 'ne gute Quelle... Siehe Links oben rechts ;>>
Verfasst: 22.09.2004 13:44
von bobobo
aber nur wenn man auf polinkerrors steht

zumindest mit PB3.91
wenn die Environmentstring bekannt sind dann kann man die hiermit auslesen
Code: Alles auswählen
Procedure.s getenv(var.s)
buff$=Space(256)
GetEnvironmentVariable_(var,buff$,256 )
ProcedureReturn var+" -> "+buff$
buff$=""
EndProcedure
Debug getenv("NUMBER_OF_PROCESSORS")
Debug getenv("PROCESSOR_ARCHITECTURE")
Debug getenv("PROCESSOR_IDENTIFIER")
Debug getenv("PROCESSOR_LEVEL")
Debug getenv("PROCESSOR_REVISION")
Debug getenv("OS")
Debug getenv("COMSPEC")
Debug getenv("HOMEDRIVE")
Debug getenv("HOMEPATH")
Debug getenv("PATH")
Debug getenv("PATHEXT")
Debug getenv("PROMPT")
Debug getenv("SYSTEMDRIVE")
Debug getenv("SYSTEMROOT")
Debug getenv("WINDIR")
Debug getenv("TEMP")
Debug getenv("TMP")
;unvollständige Liste
;Name Description System User Process (NT/2000) Process (98/ME)
;NUMBER_OF_PROCESSORS :: Number of processors running on the machine.
;PROCESSOR_ARCHITECTURE :: Processor type of the user's workstation.
;PROCESSOR_IDENTIFIER :: Processor ID of the user's workstation.
;PROCESSOR_LEVEL :: Processor level of the user's workstation.
;PROCESSOR_REVISION :: Processor version of the user's workstation.
;OS :: Operating system on the user's workstation.
;COMSPEC :: Executable file for the command prompt (typically cmd.exe).
;HOMEDRIVE :: Primary local drive (typically the C drive).
;HOMEPATH :: Default directory for users (typically \users\default in Windows 2000).
;PATH :: PATH environment variable.
;PATHEXT :: Extensions for executable files (typically .com, .exe, .bat, or .cmd).
;PROMPT :: Command prompt (typically $P$G).
;SYSTEMDRIVE :: Local drive on which the system directory resides (typically c:\).
;SYSTEMROOT :: System directory (for example, c:\winnt). This is the same as WINDIR.
;WINDIR :: System directory (for example, c:\winnt). This is the same as SYSTEMROOT.
;TEMP :: Directory for storing temporary files (for example, c:\temp).
;TMP :: Directory for storing temporary files (for example, c:\temp).
Die Maximumgröße eine Environmentvariable ist 32767 (inkl. NullTerminator)
buff$ zu groß lässt bei mir lustigerweise allerdings den Grafiktreiber abschmieren ..
Verfasst: 22.09.2004 14:20
von AndyMars
bobobo hat geschrieben:aber nur wenn man auf polinkerrors steht
Ha! Hast recht... Aber das ist ja wohl ein Fehler in den API-Definitionen von PB, oder?
Man kann's ja auch selber machen (leicht abgeändert von purearea.net):
Code: Alles auswählen
; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=1643&highlight=
; Author: wichtel
; Date: 08. July 2003
; Umgebungsvariablen lesen und setzen
; (gesetzte Umgebungsvariablen werden an Unterprozesse übergeben,
; bleiben aber nach Programmende nicht erhalten und können auch nicht
; von bereits laufenden Programmen gelesen werden)
Structure envstruct
name.s
Value.s
EndStructure
NewList env.envstruct()
; gibt als Rückgabewert die Anzahl der Umgebungsvariablen zurück
; braucht ein vorher angelegte LinkedList vom Typ envstruct
Procedure.l myListEnv()
ret$=""
envcount.l=0
LibKernel.l=OpenLibrary(#PB_Any,"kernel32.dll")
If LibKernel=0
MessageRequester("DLL error","Kann kernel32.dll nicht öffnen")
ProcedureReturn 0
EndIf
envblock.l=CallFunction(LibKernel,"GetEnvironmentStringsA") ;GetEnvironmentStrings_()
ClearList(env())
Repeat
ret$=PeekS(envblock)
If ret$<>"" And Left(ret$,1)<>"=" And Left(ret$,1)<>":"
AddElement(env())
env()\name=StringField(ret$,1,"=")
env()\Value=StringField(ret$,2,"=")
EndIf
envblock+Len(ret$)+1
Until ret$=""
CloseLibrary(LibKernel)
ProcedureReturn CountList(env())
EndProcedure
; gibt als Rückgabewert den Wert der Umgebungsvariablen zurück
; oder einenLeerstring wenn die Variable nicht existiert
Procedure.s myGetEnv(name.s)
Value.s=Space(256)
size.l=Len(Value)
GetENVIRONMENTVariable_(@name, @Value, @size)
ProcedureReturn(Value)
EndProcedure
; gibt als Rückgabewert den Wert der Umgebungsvariablen zurück
; oder einenLeerstring wenn das Setzen nicht geklappt hat
Procedure.s mySetEnv(name.s,Value.s)
If SetENVIRONMENTVariable_(@name, @Value)
ProcedureReturn Value
Else
ProcedureReturn ""
EndIf
EndProcedure
OpenConsole()
; gezielt eine Umgebungsvariable abfragen
PrintN("lesen...")
PrintN("systemroot: "+myGetEnv("systemroot"))
; eine Umgebungsvariable setzen
PrintN("setzen...")
PrintN("MeineVariable: "+mySetEnv("MeineVariable","MeinWert"))
PrintN("")
PrintN("Eingabe druecken...")
Input()
PrintN("")
; alle Umgebungsvariablen in ein LinkedList und auflisten
PrintN("Auflisten...")
Anzahl.l=myListEnv()
PrintN(Str(Anzahl)+" Umgebungsvariablen")
PrintN("")
ResetList(env())
While NextElement(env())
PrintN(env()\name+": "+env()\Value)
Delay(300) ; da kann man besser zuschauen
Wend
PrintN("")
PrintN("Eingabe druecken...")
Input()
CloseConsole()
Verfasst: 22.09.2004 14:30
von Kiffi
Code: Alles auswählen
[...]
; Umgebungsvariablen lesen und setzen
; (gesetzte Umgebungsvariablen werden an Unterprozesse übergeben,
; bleiben aber nach Programmende nicht erhalten und können auch nicht
; von bereits laufenden Programmen gelesen werden)
[...]
mich würde mal interessieren, wie man Environment-Variablen
dauerhaft setzen kann.
Danke & Grüße ... Kiffi
Verfasst: 22.09.2004 14:38
von bobobo
@AndyMars
geil das
@Kiffi
neben dem Einstellen der SystemVariablen sagt das PSD :
Calling SetEnvironmentVariable has no effect on the system environment variables. The user can add or modify system environment variables using the Control Panel. 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. This allows applications, such as the shell, to pick up your updates.
Verfasst: 22.09.2004 15:27
von Kiffi
@bobobo: Danke für die Info!
Grüße ... Kiffi
Verfasst: 22.09.2004 19:28
von wichtel
Tach auch, würde mich mal interessieren warum der alte code in 3.91 nicht mehr geht.
Wollte gerade ein Programm schreiben dass das unter Windows und Linux kann.
Unter Linux habe ich es jetzt hinbekommen und dachte unter Windows nehme ich einfach den alten code.....
mmh.
edit:
und warum zeigt mir nur der Original Editor den Fehler an, und jaPBe nur einen Linker error "no message"?
Verfasst: 25.09.2004 01:54
von Andre
Bzgl. POLINK-Errors bei Codes aus dem CodeArchiv: die neue Version wird nicht eher erscheinen, bis auch alle alten/existierenden Codes auf Funktionsfähigkeit mit v3.91 getestet wurden... (dauert deshalb eben auch seine Zeit)
