Einzelnen Beitrag anzeigen

Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: in KommandozeilenAnwendung DOS-Befehl ausführen

  Alt 25. Jul 2007, 21:45
Moin Hansa,


Zitat von Hansa:
Sie ist in der Instanz vorhanden und zwar ab dann, wenn sie gesetzt ist, auch innerhalb des BAT-Laufes.
Falsch.
Sie ist nur innerhalb des Prozesses gültig, in dem sie gesetzt wird, und dessen Kindprozessen.
Die Konsole bekommt ihr Environment beim Start. Wird aus der Konsole heraus ein anderes Programm gestartet, so bekommt dieses nur ein e Kopie des Environments der Konsole, und kann darin Umgebungsvariablen setzen und löschen wie es gerade nötig ist.
Das Environment der Konsole wird dadurch in keinster Weise beeinflusst.

Wie schon geschrieben:
Microsoft sieht hier als Lösung nur das Erzeugen einer Batchdatei, die dann im Anschluss an das eigene Programm aufgerufen wird, damit die Umgebungsvariablen in der Konsole entsprechend gesetzt werden.
Und da ich nicht bereit war diese Lösung so zu akzeptieren, habe ich mir den anderen Weg überlegt


Zitat von Hansa:
Geht ein neues Konsolen-Fenster auf, dann muss sie wieder neu gesetzt werden, weil es eine andere Instanz darstellt.
Auch falsch
Startet man die Konsole aus einem eigenen Programm, z.B. per CreateProcess, kann sie das, sozusagen ganz normal, das eigene Environment als Kopie erhalten, wie schon oben beschrieben, indem man den Pointer auf einen Environment-Block weglässt, oder aber man baut ein Environment extra für den Aufruf zusammen, und übergibt dessen Pointer. Im ersten Falle würde die Konsole also die neu gesetzte Variable zur Verfügung haben, im zweiten hängt es davon ab, was man in den Block reinschreibt.
Wird die Konsole hingegen aus dem Explorer gestartet, und man hat die Variable so gesetzt, wie in dem verlinkten Beitrag beschrieben, steht der neuen Konsole die Variable zur Verfügung.

Allgemein:
Wird kein spezielles Environment für einen Kindprozess erstellt, so erbt dieser immer das Environment des Elternprozesses, und zwar als Kopie.
Wenn im Elternprozess, vor dem Start eines Kindprozesses, etwas am Environment geändert wird, sei es nun setzen, ändern oder löschen einer Variablen, so erhält der Kindprozess das geänderte Environment.

Einfach mal zum Ausprobieren.
Man nehmen ein Formular, einen Button, und folgenden Code:

Delphi-Quellcode:
uses shellapi;
{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
  ShellExecute(0,'open','cmd.exe',nil,nil,SW_SHOWNORMAL);
  ShowMessage('Jetzt steht der Konsole das derzeitige System und Current-User Environment zur Verfügung.');
  SetEnvironmentVariable('NEUEVARIABLE','MIT EINEM WERT');
  ShellExecute(0,'open','cmd.exe',nil,nil,SW_SHOWNORMAL);
  ShowMessage('und jetzt ist etwas hinzugekommen');
end;
Sobald eine Konsole offen ist, einfach mal Set N eingeben.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat