Autor Beitrag
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 24.10.03 11:28 
Ich möchte eine Umgebungsvariable systemweit setzen.

Das Problem ist, dass Borland die Methode SetEnvVariable nicht in die API Übersetzung aufgenommen hat :evil: . Im Windows SDK gibt es die Methode zwar, aber ich weiß nicht, wie ich diese aus einem Delphi-Programm benutzen kann.

Die von Borland übernommene Methode SetEnvironmentVar setzt die Umgebungsvariable aber nur für den aufrufenden Prozess.

(Da ich das hier nicht zu Hause schreibe, bin ich mir nicht 100%-ig sicher, dass die Namen der Funktionen so sind, wie oben geschrieben, Tut mir leid!)

Ich hoffe, ihr könnt mir weiterhelfen!
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 24.10.03 11:52 
Falls du SetEnvironmentVariable meinst -

Die Funktion ist durchaus vorhanden, steht aber evtl. nicht in der Win32-API-Hilfe. Letzteres weiß ich nicht, weil ich mir diese uralte Hilfedatei ohnehin nicht anschaue. (PSDK, sage ich nur :)) Der Aufruf ist nicht das Problem, oder? Du gibst zuerst den gewünschten Namen an, dann den Wert. Bei fixen Daten
ausblenden Delphi-Quelltext
1:
SetEnvironmentVariable('Hallo','Welt');					

Bei veränderlichen Daten castest du ... nein, nicht den Superstar, sondern den String als pchar
ausblenden Delphi-Quelltext
1:
SetEnvironmentVariable('Hallo',pchar(Edit1.Text));					


Und Ja: diese Funktion wirkt nur temporär, solange dein Programm läuft. Das liegt aber nicht an einem Fehler von Borland, sondern das "isso" ... Ist IMHO auch recht nützlich, denn so kann dein Programm eigene Umgebungsvariablen benutzen, die beim Beenden wieder verschwinden und nicht das System zumüllen.
Wenn du allerdings systemweite Variablen setzen willst (bzw. musst), dann musst du mal schauen, wo diese gespeichert werden. Unter 9x ist´s die "autoexec.bat" (d.h. also Textdatei öffnen, "PATH" suchen und deine Variable ergänzen -> Neustart), bei NT weiß ich´s gerade nicht. Aber die stehen sicher auch irgendwo.

Gruß.
jaenicke Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 29.10.03 14:36 
Titel: Ja, soweit bin ich
Danke Dir!

Genau! Diese Methode meinte ich, mit der Methode, die die Umgebungsvariable nur für den aktuellen Prozess setzt!

Ich wollte sie aber eben systemweit setzen, und da habe ich in der SDK Dokumentation eine zweite Funktion SetEnvVariable gefunden! Die hat Borland aber nicht in die Übersetzung der C-Dateien übernommen, das heißt ich kann diese Funktion zwar vom C++-Builder aus aufrufen, aber nicht von Delphi aus! (Und der Umweg über eine in C geschriebene Dll gefällt mir auch nicht :wink: ...

Die Frage :?: ist eben: Wie kann ich diese Funktion von Delphi aus aufrufen?
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 29.10.03 15:25 
SetEnvVariable? Ich bin nicht sicher, da sich aber das PSDK dazu ausschweigt, muss das wohl ein uralter Befehl sein ... :? Will sagen: ich kenne diese Funktion, ehrlich gesagt, nicht.

Ansonsten wie gesagt: du musst schauen, wo die Umgebungsvariablen gespeichert sind. Für 9x habe ich´s dir ja schon gesagt. Für NT/2000/XP wird´s wohl irgendwo in der Registry stehen.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 29.10.03 16:53 
Unter 2000 und XP stehen die Umgebungsvariablen, wie vermutet, in der Registry.

User-lokal: HKCU\Environment
System-global: HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

Für letzteres sind Admin-Rechte erforderlich.
Der Admin hat aber selbst natürlich auch einen Environment-Schlüssel.

Für 9x müsstest du, wie schon erwähnt, die "autoexec.bat" bearbeiten und das System dann idealerweise neu starten.

Damit solltest du doch eigentlich was anfangen können. Ergebnis könnte eine Funktion für die hiesigen FAQs sein (wenn es wirklich keine API-Funktion zum Setzen globaler Umgebungsvariablen gibt). Meine wäre fertig ;) ... aber ich warte mal ab, wer hier noch was zustande bringt. :)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 29.10.03 18:33 
Nö, er muss doch nur die autoexec.bat ausführen oder täusche ich mich da? Hat bei mir immer geklappt.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 29.10.03 18:49 
Unter 9x: Ja. Allerdings kann es ja sein, dass mancher da noch Treiber oder so was drin hat. Da ist es evtl. nicht so gut, wenn man das Ding noch mal ausführt. In dem Fall wäre ich persönlich für den Neustart von Windows.

Haben die ganzen Setup-Programme (früher bei DOS) nicht anders gemacht. Da hat keins geschrieben:
Zitat:
Klicken Sie hier, um die Autoexec.Bat neu zu starten

Wichtig war ja auch nur, dass er einen Ansatzpunkt für sein Problem hat. Oder kennst du eine Funktion zum Setzen von systemweiten Umgebungsvariablen?
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 29.10.03 19:04 
Also for NT ff. ist wohl die offizelle Methode nur die über die Registry:
PSDK hat folgendes geschrieben:

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.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 29.10.03 19:24 
Na dann habe ich ja eine passende, OS-abhängige Funktion zum Setzen von globalen Umgebungsvariablen. :)
jaenicke Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 30.10.03 09:12 
Titel: zum SDK
Hallo!

Danke, euch allen!

Dass das so geht, ist erstmal gut, nur kann ich dann unter 9x (autoexec.bat) nicht sofort wissen, ob ich die Variable richtig gesetzt habe.
Zudem könnte dabei mal etwas schief gehen. (Es geht allerdings so, das ist kein Problem)
Deshalb noch einmal zu dieser Funktion:

In der SDK Hilfe steht folgende Beschreibung:

Zitat:
BOOL SetEnvVariable(LPSTR szName, LPSTR szValue, CMO cmo);

SetEnvVariable sets the specified environment variable to a certain value.
The environment variable can also be elongated by specifying the command
option flag fAppend or fPrepend. Under Windows NT, the environment variables
affected are the ones specified in the registry.
Under Windows 95, autoexec.bat is modified to set the values.

Arguments

szName

Specifies the name of the environment variable.

szValue

Specifies the new value that you want to associate with the environment variable.

cmo

Specifies the command option flag. You can use fOverwrite, fAppend, or fPrepend.


Das würde immer funktionieren, nicht nur unter jeweils einem (oder wenigen) Betriebssystemen.

Ich bräuchte jetzt folgende Informationen:
Erstens: In welcher Laufzeitbibliothek steht diese Funktion?
Zweitens: Welche Werte haben die Konstanten für "cmo"?


Ach so, und ich habe noch etwas falsches geschrieben! Unter dem C++-Builder 5
kann ich die Funktion auch nicht benutzen! Sorry!


Danke für eure Hilfe schon mal im Voraus! Und: Ich habe es nicht sehr eilig, ihr könnt euch also ruhig etwas Zeit lassen :-) ...

Und wenn das mit der Funktion nichts wird, mache ich es wie von euch vorgeschlagen! Danke!

Schönen Gruß, S.J.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 30.10.03 11:35 
Da die Funktion im aktzuelle PSDK nicht mehr enthalten ist, würde ich davon abraten sie zu benutzen. Desweiteren, von wann ist das PSDK. Und unten steht immer die Header-Datei und die Betriebssysteme, in denen die Funktion verfügbar ist.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 30.10.03 12:44 
In dem Fall nicht, @Luckie. Ich habe auch extra mal meine Delphi-CD eingeschmissen und nachgeschaut. Die Funktion wird in der "Win32SDK.hlp" tatsächlich erwähnt, allerdings fehlen sämtliche Hinweise auf Unit bzw. Headerdatei. Bei der in der HLP ebenfalls enthaltenen Funktion SetEnvironmentVariable sieht das wieder anders aus - da steht beides dabei.