Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit SetEnvironmentVariable (https://www.delphipraxis.net/17333-problem-mit-setenvironmentvariable.html)

cruiser 3. Mär 2004 12:46


Problem mit SetEnvironmentVariable
 
Ich möchte eine kleines Konsolen-Tool schreiben, das einen String als eingabe aufnimmt und in eine (System)Variable schreibt, so dass in einer Batch-Datei weiterhin darauf zugegriffen werden kann. Bis zum Einlesen des Strings funktioniert alles wie es soll (3te Zeile von unten). Ich bin mir nicht sicher ob SetEnvironmentVariable da die richtige Funktion ist, aber vielleicht hab ich ja auch nur einen anderen Denkfehler drin.

Delphi-Quellcode:
program input;
{$APPTYPE CONSOLE}
uses
  SysUtils,windows;
var
  i: integer;
  st: string;
begin
  if ((paramstr(1)='/?') or (paramstr(1)='-?'))
  then begin
    writeln('INPUT [/?] [<Text>]');
    writeln;
    writeln(' /?     - Zeigt diesen Hilfetext an.');
    writeln(' <Text> - Dieser Text wird vor der Eingabezeile angezeigt.');
    exit;
  end else if paramstr(1) <> ''
  then begin
    for i := 1 to paramcount do begin
      if i > 1 then st := st + ' ';
      st := st + paramstr(i);
    end;
    writeln(st);
  end;
  readln(st);
  SetEnvironmentVariable('input',pchar(st));
end.

Christian Seehase 3. Mär 2004 15:23

Re: Problem mit SetEnvironmentVariable
 
Moin Cruiser,

das Problem an der Sache ist folgendes:
Wenn aus einer Konsole heraus ein Programm gestartet wird, so erbt es in der Regel das Environment des Aufrufers, also das der Konsole, und arbeitet mit einer Kopie dieses Environments.
Wird das Programm dann geschlossen, so sind auch alle Änderungen an den Umgebungsvariablen hinfällig.
Es bringt auch leider nichts die Werte direkt in die Registry zu schreiben, da diese erst nach den Start einer neuen Konsole ziehen. Eine Broadcast Message an alle Toplevel Fenster, dass sich etwas im Enviroment geändert hat bringt leider auch nichts, da die Konsolen diese nicht verarbeiten.

Der Workaround den Microsoft dazu vorschlägt ist dann auch der auf den man wohl noch selber kommen würde:
Das Programm das Umgebungsvariablen setzen soll, die dann im weiteren Verlauf des Batches benögtigt werden, erzeugt eine Batchdatei mit festgelegtem Namen, und den entsprechenden Set-Zeilen zum Setzen der Variablenwerte.
Nach dem Aufruf des Programmes muss dann noch der Aufruf eben dieser, durch das Programm erst erzeugten, Batchdatei folgen, damit weitere Programme auf die Werte der Variablen zugreifen können.

Meine Idee dazu, die ich allerdings bislang nicht weiter verfolgt habe:
Man müsste das Environment des Parentprozesses manipulieren, um den Workaround vermeiden zu können.

cruiser 3. Mär 2004 23:10

Re: Problem mit SetEnvironmentVariable
 
puha... eine festgelegte Batch wollt ich eigentlich vermeiden, es ging mir eher um die Sache an sich. Und das Environment des Parentproc ändern... naja...

ich hab in der SDK-Hilfe was gefunden...
aber C zu lesen ist nich so mein Ding...

ich versuch mal den Workaround

cruiser 3. Mär 2004 23:40

Re: Problem mit SetEnvironmentVariable
 
Damit...

Delphi-Quellcode:
{...}

  readln(st);
  sl := TStringList.Create;
  sl.Add('@set input='+st);
  sl.SaveToFile('i.bat');
  sl.Free;
end.
und damit...

Zitat:

@echo off
input Try it!
call i.bat
del i.bat
echo ______________
echo.
echo Try: %input%
set input=
geht es... für meinen Geschmack etwas dirty... aber wohl die schnellste Lösung

Christian Seehase 4. Mär 2004 18:53

Re: Problem mit SetEnvironmentVariable
 
Moin Cruiser,

Zitat:

Zitat von cruiser
für meinen Geschmack etwas dirty... aber wohl die schnellste Lösung

und es ist die dokumentierte Lösung ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz