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/)
-   -   Verzeichnisangaben mit enthaltenen Umgebungsvariablen (https://www.delphipraxis.net/181898-verzeichnisangaben-mit-enthaltenen-umgebungsvariablen.html)

Der schöne Günther 16. Sep 2014 11:01

Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Es ist wieder Zeit für dumme Fragen: Warum kann ich auf der Konsole einfach sagen
Code:
C:\>cd %public%\Pictures

C:\Users\Public\Pictures>echo %public%
C:\Users\Public

C:\Users\Public\Pictures>
?

Ist "CD" so schlau und zerlegt sein Argument in mehrere Teile, liest mit "%" maskierte Teile als Umgebungsvariable aus und und und? Ich kenne unter der WinApi nur SetcurrentDirectory(LPCTSTR) und das steigt mit einem "Fehlercode 2: Das System kann die angegebene Datei nicht finden" aus.

Gibt es noch mehr oder schlichtweg keine einfache Lösung?

Dalai 16. Sep 2014 11:07

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Die CMD löst Umgebungsvariablen natürlich auf, d.h. das CMD-interne Kommando CD bekommt einen absoluten Pfad übergeben (bzw. den Variableninhalt). In einem Delphi-Programm muss man mit ExpandEnvironmentStrings von Hand dafür sorgen.

MfG Dalai

Der schöne Günther 16. Sep 2014 11:25

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Oh, ExpandEnvironmentStrings(..) und das Gegenstück PathUnExpandEnvStrings(..) kannte ich gar nicht.

Danke :-)

hathor 16. Sep 2014 13:08

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Ausserdem:
Befehle im CMD-Fenster ergeben andere Path-Variablen als wenn sie in einem WINDOWS-Programm aufgerufen werden.

Dalai 16. Sep 2014 15:52

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Zitat:

Zitat von hathor (Beitrag 1272768)
Ausserdem:
Befehle im CMD-Fenster ergeben andere Path-Variablen als wenn sie in einem WINDOWS-Programm aufgerufen werden.

Kannst du das mal näher erläutern? Ich wüsste nämlich nicht, wo da ein Unterschied herkommen soll. Umgebungsvariablen sind Umgebungsvariablen und die sind für alle Programme gleich, jedenfalls wenn die Programme diese nicht ändern.

MfG Dalai

Der schöne Günther 16. Sep 2014 16:03

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Oder die Programme die sie aufrufen ihnen andere Umgebungsvariablen mitgeben.

EWeiss 16. Sep 2014 16:31

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Verstehe jetzt dein Problem nicht.

Ich mach das auf diese weise und die API sollte eigentlich bekannt sein.

Code:
    'Setze den Pfad zum BassPath
    BassPath = "%Path%;" & App.Path & "\BassLib"
    SetEnvironmentVariable "Path", BassPath
Beispiel aus meinem Mediaplayer in VB.

gruss

Der schöne Günther 16. Sep 2014 16:55

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Es ging darum, ob man WinApi-Routinen (welche Pfade erwarten) eventuell auch mit bestehenden Umgebungsvariablen füttern kann. Nicht Umgebungsvariablen zu setzen ;-)

EWeiss 16. Sep 2014 17:00

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1272803)
Es ging darum, ob man WinApi-Routinen (welche Pfade erwarten) eventuell auch mit bestehenden Umgebungsvariablen füttern kann. Nicht Umgebungsvariablen zu setzen ;-)

Jo und wenn nicht dann setzt man sie halt.
Bleibt doch das gleiche.

gruss

p80286 16. Sep 2014 17:14

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Zitat:

Zitat von Dalai (Beitrag 1272791)
Zitat:

Zitat von hathor (Beitrag 1272768)
Ausserdem:
Befehle im CMD-Fenster ergeben andere Path-Variablen als wenn sie in einem WINDOWS-Programm aufgerufen werden.

Kannst du das mal näher erläutern? Ich wüsste nämlich nicht, wo da ein Unterschied herkommen soll. Umgebungsvariablen sind Umgebungsvariablen und die sind für alle Programme gleich, jedenfalls wenn die Programme diese nicht ändern.

MfG Dalai

Würde mich jetzt aber auch interessieren, das Users<->Benutzer Gewurschtel ist es ja wohl nicht oder meinst Du das Codepage-Problem
Zitat:

C:\Users\xxxxx\Desktop>echo ³cksel
³cksel

C:\Users\xxxxxx\Desktop>pause
Zitat:

echo ücksel
pause
Gruß
K-H

hathor 16. Sep 2014 17:47

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Kann jeder selbst nachprüfen:

1. Im CMD-Fenster:
- path eingeben

2. Mit DELPHI:
Memo1.Lines.Add(System.SysUtils.GetEnvironmentVari able('path'));
überprüfen

3. Im CMD-Fenster:
- path C:\ eingeben
- path eingeben

4. Mit DELPHI:
Memo1.Lines.Add(System.SysUtils.GetEnvironmentVari able('path'));
überprüfen
--- keine Änderung!


Siehe Anhang...

himitsu 16. Sep 2014 17:53

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Um das klarzustelen:

Die meisten WinAPIs lösen keine Umgebungsvariablen auf.
Viel schlimmer noch, denn "%irgendwas%" ist (in langen Pfadangaben, also nicht die alten 8.3-DOS-Pfade) ein korrekter Datei-/Verzeichnisname,
was dann gern darin endet, daß komische Programme gern mal Verzeichnisse mit solchen Dateinamen anlegen. :stupid:

Anhang 41830


Und das Andere:
Jedes Programm (jeder Prozess) kann ein eigenes Set von Umgebungsvariablen besitzen.
Es bekommt es zwar meistens standardmäßig von deinem Aufrufer/Starter vererbt, aber der Prozess kann den Inhalt zur Laufzeit selber manipulieren, oder der Prozess bekomm beim Aufruf ein "anderes" Set mitgegeben.

In Delphi kennt man das z.B. als Delphi-Optionen > Umgebungsoptionen > Umgebungsvariablen > Vom Anwender überschrieben, welches dann für die IDE und von der IDE gestarteten Programmen gilt.



Und natürlich kann bei der Pfadbehandlung auch noch eine "manuelle" Behandlung von solchen "Variablen"-Platzhaltern implementiert sein, alternativ oder zusätzlich zu diesen Environment-Variablen.

Dalai 16. Sep 2014 17:54

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
@hathor: Und weiter? Das zeigt doch nur, dass jedes Programm die Umgebungsvariablen beliebig ändern kann, ohne dass dabei die ursprünglichen Inhalte oder die Inhalte derselben Variablen in anderen Prozessen verändert werden! Das ist ein völlig normales Verhalten und auch von Delphi-Programmen (und anderen Programmen) aus nachvollziehbar. Öffne zwei Instanzen einer CMD und du wirst dieselben Ergebnisse erhalten.

IIRC gibt es eine API-Funktion, mit der man Änderungen an Umgebungsvariablen im System bekanntmachen kann und auch welche, mit denen man über solche Änderungen informiert werden kann; vermutlich sind das irgendwelche Messages.

MfG Dalai

Sir Rufo 16. Sep 2014 21:56

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
@himitsu

Genau weil es sich um gültige Dateinamen handelt dürfen die WinApi-Funktionen das auch nicht automatisch auflösen. Genau aus dem Grund gibt es in der Registry auch den Value Type
REG_EXPAND_SZ
A null-terminated string that contains unexpanded references to environment variables (for example, "%PATH%"). It will be a Unicode or ANSI string depending on whether you use the Unicode or ANSI functions. To expand the environment variable references, use the ExpandEnvironmentStrings function.

DeddyH 17. Sep 2014 07:37

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Zitat:

Zitat von hathor (Beitrag 1272811)
Kann jeder selbst nachprüfen:

1. Im CMD-Fenster:
- path eingeben

2. Mit DELPHI:
Memo1.Lines.Add(System.SysUtils.GetEnvironmentVari able('path'));
überprüfen

3. Im CMD-Fenster:
- path C:\ eingeben
- path eingeben

4. Mit DELPHI:
Memo1.Lines.Add(System.SysUtils.GetEnvironmentVari able('path'));
überprüfen
--- keine Änderung!


Siehe Anhang...

Der "Beweis" hinkt aber ganz gewaltig. Schließ doch mal das Konsolenfenster, mach es neu auf und lass Dir Path ausgeben... Überraschung!

[edit] Irgendwie hab ich übersehen, dass nach himitsus noch andere Posts kamen :oops: [/edit]

hathor 17. Sep 2014 10:12

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Das ändert nichts an meiner Aussage:
"Befehle im CMD-Fenster ergeben andere Path-Variablen als wenn sie in einem WINDOWS-Programm aufgerufen werden."

Wollt Ihr jetzt "jahrelang" darüber diskutieren?

DeddyH 17. Sep 2014 10:23

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Und durch Wiederholung wird das richtiger? Aber meinetwegen, jeder darf ja glauben, was er will.

Sir Rufo 17. Sep 2014 12:36

AW: Verzeichnisangaben mit enthaltenen Umgebungsvariablen
 
Jeder Prozess fängt mit dem gleichen Stand der Umgebungsvariablen an. Werden dann innerhalb des Prozesses Umgebungsvariablen geändert, dann gelten diese Änderungen nur für diesen Prozess.

Das sollte bekannt sein und ist auch nur vernünftig, denn sonst könnte man keine Batch-/Command-Dateien parallel laufen lassen, weil man ständig auf Überschneidungen dieser Umgebungsvariablen aufpassen müsste (wenn man diese benutzt).


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:20 Uhr.

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