Autor Beitrag
OsCor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
BeitragVerfasst: Do 24.03.11 12:03 
Hallo Foristen,

eine Anwendung ist einerseits im täglichen Betrieb (Zugriff über einen Netzwerkpfad), wird aber auch laufend weiterentwickelt. Wenn eine neue lauffähige exe bereitsteht, wird diese in ein Verzeichnis kopiert, das dann mittels Umbenennung zum Programmverzeichnis wird. (Kopieren --> Alt, Umbenennen Alt --> Neu, Umbenennen Ziel --> Alt, Umbenennen Neu --> Ziel)
Das führt dazu, dass die gerade aktiven User, die bisher mit der exe im Verzeichnis Ziel arbeiten, jetzt den Programmpfad zum Verzeichnis Alt nutzen - jedenfalls so lange bis das Programm neu gestartet wird.
Jetzt meine Frage: Wie kann ich aus dem Programm (D2007) heraus feststellen, wie das Verzeichnis heißt, in dem die momentan genutzte exe liegt?

Ich hoffe, das ist verständlich ausgedrückt.

Oswald
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 24.03.11 12:24 
ausblenden Delphi-Quelltext
1:
ExtractFileDir(ParamStr(0));					

_________________
We are, we were and will not be.

Für diesen Beitrag haben gedankt: Jakane
OsCor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
BeitragVerfasst: Do 24.03.11 14:38 
Hallo, Gausi!

Ich bin einfach nicht darauf gekommen, dass in den Dateifunktionen die Lösung liegen könnte. Beim Nachschauen, wie ExtractFileDir verwendet wird, bin ich auf die Funktion GetCurrentDir gestoßen. Das funktioniert allerdings auch nur, wenn die exe im Arbeitsverzeichnis liegt. Dieses wird nämlich von GetCurrentDir angezeigt, wenn man bei den Eigenschaften einer Verknüpfung im Feld „Ausführen in” ein spezielles Arbeitsverzeichnis eingibt.

Gerne wüßte ich den Unterschied von GetCurrentDir und GetDir. Letzteres ermittelt laut Delphi-Hilfe das aktuelle Arbeitsverzeichnis.

Vielen Dank
Oswald
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 24.03.11 15:02 
zur Erklärung: In ParamStr(0) steht der komplette Pfad des Programmes drin, das gerade ausgeführt ist. ExtractFileDir bzw. ExtractFilePath schneidet aus diesem String das "meinProg.exe" ab. Die eine Funktion mit, die andere ohne das letzte "\". Mit CurrentDir hat das nichts zu tun. ;-)

_________________
We are, we were and will not be.
OsCor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
BeitragVerfasst: Do 24.03.11 17:31 
Knackpunkt war das Argument für die Funktion. Die Hilfe sagt da leider nichts dazu.

Alles klar. Vielen Dank!

Oswald
FrEaKY
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 235


D7
BeitragVerfasst: Do 24.03.11 18:55 
Darf ich direkt mal eine Frage einwerfen - ich muss jedes mal überlegen, ob ich nun den "\" reinmachen muss oder nicht.
Ist da laut Definition ein Unterschied zwischen Dir und Path, oder nur bei diesen beiden Funktionen willkürlich?
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: Do 24.03.11 22:28 
In Delphi sollte das immer so sein, mit fällt jedenfalls gerade keine Ausnahme ein.

Du kannst aber auch einfach IncludeTrailingPathDelimiter verwenden.
OsCor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
BeitragVerfasst: Fr 25.03.11 10:38 
Sorry, muss die Frage wieder als offen kennzeichnen, weil mein Problem doch noch nicht gelöst ist:

Wenn man ein Programm startet und ExtractFileDir aufruft, erhält man den Pfad, aus dem das Programm aufgerufen wurde. So weit, so gut.
Wenn man dann diesen Pfad umbenennt (während das Programm läuft) und ExtractFileDir timergesteuert nach dem Pfad suchen läßt, wird der ursprüngliche Pfad ausgegeben und nicht der neue. In welchem Pfad das Programm augenblicklich tatsächlich hängt, zeigt mir das Tool „WhoHasIt” - und das findet die exe eben unter dem neuen Pfad.

Geht das so also gar nicht oder hat jemand noch eine Idee?

Oswald
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 25.03.11 11:12 
Ich kann das nicht testen, da bei mir (wie eigentlich auch normal) ein Umbenennen des Verzeichnisses während die Exe läuft nicht möglich ist. Aber du könntest OpenProcess + NtQueryInfomationFile + NtQueryObject versuchen. :nixweiss:

Ob das klappt kannst du auch vorher im Process Monitor prüfen. Wenn dort das Handle zur Exe mit dem neuen Pfad gefunden wird, klappt das so.
OsCor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
BeitragVerfasst: Fr 25.03.11 11:19 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich kann das nicht testen, da bei mir (wie eigentlich auch normal) ein Umbenennen des Verzeichnisses während die Exe läuft nicht möglich ist.

Es handelt sich um LW-Pfade in einem Novell-Netzwerk. Lokal habe ich das noch nie probiert.

Oswald
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 25.03.11 11:19 
Das Umbenennen funktioniert unter gewissen Umständen.
Ich benenne auch schonmal Dateien im Netzwerk um, obwohl sie in Benutzung sind. Überschreiben geht allerdings nicht. Ist eine Frage des Betriebssystems.
Aber es sollte eigentlich logisch sein, dass die "alten" Angaben bestehen bleiben, bis die Bindung aufgehoben ist. Zum Beispiel durch Beenden des Programms. Dadurch kann bis dahin natürlich erstmal nur der alte Zustand über die Pfade und Dateinamen zurückgeliefert werden.
OsCor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
BeitragVerfasst: Fr 25.03.11 11:43 
user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Aber es sollte eigentlich logisch sein, dass die "alten" Angaben bestehen bleiben, bis die Bindung aufgehoben ist.

Der Grund, warum ich diese Vorgehensweise wählen wollte, war eben das vorher zitierte Tool „WhoHasIt”, das bei Angabe des Pfades und der gesuchten Datei angibt, wer denn gerade mit dem Programm arbeitet (IP-Adresse und Username). Diese Informationen gibt das Tool aber nur aus, wenn der Pfad stimmt:
Wenn ich einen Pfad umbenenne, von dem aus drei Personen das Programm gestartet haben, finde ich die Informationen darüber, wer mein Programm gestartet hat, nur wenn ich den neuen Pfadnamen angebe.
Also einen Weg scheint es grundsätzlich zu geben.

Oswald
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 25.03.11 12:38 
Dabei ist zu beachten, dass das ein Netzwerk-Tool für Novell ist.
Die Funktionen von Delphi können dies aber nicht nutzen.
OsCor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
BeitragVerfasst: Fr 25.03.11 13:19 
user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Dabei ist zu beachten, dass das ein Netzwerk-Tool für Novell ist.

Richtig.
Zitat:
Die Funktionen von Delphi können dies aber nicht nutzen.

Bis jetzt haben wir jedenfalls noch keinen Weg gefunden.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 25.03.11 14:03 
Nichts ist unmöööglich. :wink:
Das Problem ist, dass Delphi nur Funktionen aus Windows (üblicherweise über die API) zur Verfügung stehen oder eigene Routinen.
Ein Zugriff auf Funktionen für Novell sind mir so nicht bekannt.

Falls das Tool über eine DLL verfügt, kann man es evtl. darüber versuchen. Möglicherweise ist die entsprechende Funktion dort enthalten.
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Sa 26.03.11 17:19 
Interessant könnte in diesem Zusammenhang auch [url=www.michael-puff.de/...rentDirectory.shtml]ein Artikel Luckies[/url] sein.
OsCor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win XP, Win 7 (32)
Delphi 2007 Prof, RAD Studio XE2
BeitragVerfasst: Mo 28.03.11 09:14 
Danke. Das ist aber natürlich dasselbe, was Gausi weiter oben schon geschrieben hat. Das klappt ja. Problem ist, dass die Änderung des Netzwerkpfades durch Umbenennen von Paramstr(0) nicht erkannt wird.

Oswald
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 28.03.11 14:31 
Natürlich wird das bemerkt beim nächsten Start. Während die Anwendung läuft natürlich nicht, weil die Parameter nur beim Start übergeben werden.