![]() |
Application Path
Hi Leute,
wie kann ich den Applikationspfad meiner Anwendung in Delphi herausfinden? Irgendwie mit extractpath, oder so ähnlich? Könnt ihr mir helfen? Vielen Dank im voraus. Gruss xthing |
Re: Application Path
das ist:
Zitat:
Grüße Klaus |
Re: Application Path
Hallo,
Delphi-Quellcode:
oder
ExtractFilePath(Application.ExeName)
Delphi-Quellcode:
ExtractFilePath(ParamStr(0))
|
AW: Application Path
Dazu haette ich noch eine Frage
Bei mir klappt das mit dem Pfad so lange ich in der Entwicklungsumgebung bin. Kopiere ich jedoch das kompilierte Programm Main.exe mitsamt einem Unterverzeichnis (im gleichen Ordner wie Main.exe) in irgendein anderes Verzeichnis und fuehre es aus, dann findet das Programm den Unterordner nicht mehr. Das heisst ExtractFilePath(Application.ExeName) entspricht dann nicht mehr dem Pfad zur Main.exe. Wieso ist das so? Ich dachte ExtractFilePath(Application.ExeName) gibt immer den Pfad zur Main.exe zurueck auch wenn ich Main.exe an beliebige Orte auf der Platte kopiere. Gutelo |
AW: Application Path
Das ist auch so. Wo liegt denn dein Programm und was wird dort zurück gegeben?
Ein Beispiel: c:\programme ist ab Vista nur eine Umleitung auf c:\program files, so dass du letzteres zurück bekommst. |
AW: Application Path
Kommt drauf an: Wenn du dein Release-Verzeichnis z.B. in C:\Program Files\ kopierst, hast du dort in der Regel keine Schreibrechte. Deshalb "biegen" neuere Windows-Versionen den Programmpfad um und schreiben in Wirklichkeit in einen öffentlichen Pfad. Das ist natürlich falsch! Jaenicke hat es oben korrekt dargestellt ...
Eine portable Anwendung sollte allerdings, da sie ja nicht in einem der System-Ordner liegt, durchaus in ihr Programmverzeichnis schreiben dürfen. Dazu hat ![]() ![]() ![]() |
AW: Application Path
Hallo ich habs gerade nochmal ausprobiert.
Wenn ich es unter C:\users\userxyz\Downloads\Unterordner\ packe dann geht es nicht. Wenn ich es irgendwo auf D:\ packe dann geht es. Anscheinend gibt es in den User Ordnern Probleme. |
AW: Application Path
Was heißt "geht nicht"? Was steht denn in Application.Exename bzw. ParamStr(0)?
|
AW: Application Path
Liegt es nur an den Ordner "Downloads". Dieses ist im Explorer nicht direkt ein Ordner sondern eine Weiterleitung auf einen beliebigen Ordner.
Sag uns doch mal bitte die Fehlercodes oder die Exception. |
AW: Application Path
Da es hier danach klingt.
KEINE relativen Pfade verwenden, denn das Arbeitsverzeichnis muß nicht dem Programmverzeichnis entsprechen (z.B. wenn das Programm über einen Link oder in einem umgeleiteten Vertzeichnis im Explorer, über aufgerufen mit relativen Pfaden und über Suchpfade gefunden) und das arbeitsverzeichnis kann sich auch während Laufzeit des Programms leicht mal verändern (daür reicht schon ein TOpenDialog aus). |
AW: Application Path
Hoppla, wirklich? :shock:
Das Arbeitsverzeichnis kann sich ändern, ohne dass ich es selbst, z.B. mit
Delphi-Quellcode:
ändere?
SetCurrentDir(..)
|
AW: Application Path
Jo, ist schon passiert, darum immer mit vollqualifizierten Namen arbeiten
oder sich erst vergewissern wo man ist und dann gleich schreiben/lesen. Gruß K-H |
AW: Application Path
Dazu gibt es von mir auch eine genauere Erklärung inkl. Demo:
![]() |
AW: Application Path
Zitat:
|
AW: Application Path
Zitat:
Was ist denn so schwer an einem MessageBox(Handle,PChar(Paramstr(0)),'Info',mb_Ok or mb_IconInformation or mb_DefButton1); oder MessageBox(0,PChar(Paramstr(0)),'Info',mb_Ok or mb_IconInformation or mb_DefButton1); im Procedure TFormSonstwas.FormCreate(Sender: TObject); um den Pfad der Echse herauszukriegen? ???:oops::twisted: |
AW: Application Path
MB_OK or MB_DEFBUTTON1? :mrgreen:
|
AW: Application Path
Zitat:
mb_IconInformation or mb_DefButton1); Leck' Dich doch selbst grün :thumb: |
AW: Application Path
Wenn man keine relativen Pfade verwendet dann ist Programm so portabel wie der Eifelturm. Links unter Windows halte ich ehrlich gesagt fuer wenig sinnvoll, ausgenommen Verknuepfungen auf dem Desktop. Kann mir aber kaum vorstellen dass Delphi in dem Falle eines Aufrufs ueber einen Link den Pfad des Links zurueckgibt.
Ich werde mal testen wo der Pfad steht wenn ich das Programm im User Verzeichnis ausfuehre und dann bescheidgeben. |
AW: Application Path
Zitat:
MfG Dalai |
AW: Application Path
Kommen wir nochmal zu den "Datei öffnen"-Dialogen zurück. Die sind bislang aber auch die einzige Ausnahme, oder?
|
AW: Application Path
Zitat:
Auch die "Art" des Aufrufs/Starts des Programms ist entscheidend. Im Prinzip kann einem das bei vielen (Fremd)Komponenten/-Codes passieren, welche mit Zugriffen auf die Festplatte arbeiten. Grundsätzlich muß sollte man so sowieso immer davon ausgehen, daß "externe" Einstellung/Daten nicht als gegeben/konstant angesehen werden können. |
AW: Application Path
hmm, irgendwie beisst sich die Katze doch in den eigenen Schwanz. Entweder verzichtet man auf die Verwendung des "hardkodierten Pfades" und kann das Programm ueberhaupt nicht mehr Verschieben nach der Installation, oder man verwendet Sie mit der Gefahr dass sich der Wert der Variablen aendert. Letzteres impliziert dass man jedes Mal oben angesprochene Sicherheitsabfragen durchfuehren muss und gegebenenfalls darauf angewiesen ist den gesammten Verzeichnisbaum des Laufwerks zu durchsuchen.
Es ist Aufgabe von Embacedero sicherzustellen dass diese Funktion macht was Sie machen soll. Ehrlichgesagt sollte es simpel sein das Verzeichnis bei Ausfuehren des Programms so zu speichern dass der Wert durch andere Operationen nicht veraendert wird. Klingt eher wie ein Major Bug in Delphi. |
AW: Application Path
Nein.
relative Pfade sind böse und hardcodierte Pfade genauso (vorwie aus dem Grund, weil es bescheuerte Programmierer gab, welche Pfade hardcodierten, spricht das Verzeichnissystem nun englisch und der Benutzer sieht aber was Anderes) Man fragt Windows nach den benötigten Verzeichnissen und verwendet diese für die Zugriffe mit den resulierenden absoluten Pfaden. Es ist nicht die aufgabe von Embarcadero. Ganz im Gegenteil. Das ist ein normales Verhalten seitens des Betriebssystems. Vorallem das Verhalten, daß bei Programmstart das Arbeitsverzeichnis nicht dem Programmverzeichnis entsprechen muß. |
AW: Application Path
Zitat:
Aber: Zitat:
Im Endeffekt bin ich nur faul und würde gerne wissen, ob ich weiterhin ruhig schlafen kann oder die Sache doch möglichst bald angehen sollte: Bislang habe hole mir oft dynamisch das Arbeitsverzeichnis (ohne es je selbst zu ändern) und bastele mir damit dann eine absolute Pfadangabe zusammen. Wenn mir nun irgendetwas ohne mein Wissen das Arbeitsverzeichnis ändert ist das natürlich nicht nett :pale: |
AW: Application Path
Zitat:
Der Fehler liegt nicht in Delphi oder bei Embarcadero, wenn diese Funktionen falsch benutzt werden... // EDIT: Zitat:
Da gibt es einige Möglichkeiten. Zitat:
|
Zusammenfassung
Da bei einigen offenbar rege Begriffsverwirrung herrscht, möchte ich das bisher Gesagte noch einmal zusammenfassen:
Das Anwendungsverzeichnis ändert sich nicht, während das Programm läuft:
Delphi-Quellcode:
Das Arbeitsverzeichnis kann sich während des Programmlaufs jedoch ändern, z.B. durch einen Aufruf von OpenDialg oder SaveDialog:
Anwendungsverzeichnis := SysUtils.ExtractFilePath(System.ParamStr(0));
Anwendungsverzeichnis := SysUtils.ExtractFilePath(Forms.Application.ExeName);
Delphi-Quellcode:
Wenn ich im Programm ein festes Verzeichnis benötige, das sich nicht ändern soll, dann lege ich dieses Verzeichnsi beim Programmstart fest, z.B. den Ort, an dem die benötigte Firebird-Datenbank zu finden ist:Arbeitsverzeichnis := SysUtils.GetCurrentDir;
Delphi-Quellcode:
Diesen Speicherort ermittle ich entweder durch einen OpenDialog oder lege ihn in einer Ini-Datei fest (das kann auch ein einfaches Ascii-File mit nur einer Zeile sein). Diese Ini-Datei speichere ich nur dann im Anwendungsverzeichnis, wenn
Const
DB_Datei = 'MeineDatenbank.FDB'; Var DB_DateiName, DB_DateiPfad : String; 1. sie nicht vom Programm verändert zurückgeschrieben werden soll und/oder 2. es sich um eine portable Anwendung handelt, die sich nicht in einem der Windows-Systemordner befindet. Ansonsten speichert man Ini-Dateien (und andere, die man benötigt) im Benutzer-Verzeichns, und zwar bei: WinXP entweder unter \AllUsers\Anwendungsdaten oder \[CurrentUser]\Anwendungsdaten Win7 entweder unter \Users\Public\Documents\MeineAnwendungsDaten\ oder entsprechend unter \Users\[CurrentUser]\ Win 8 weiß ich nicht, hab ich nicht ... Oder man setzt entsprechende Registry-Einträge und erfährt dann aus der Registry alle notwendigen festen Verzeichnisse. |
AW: Application Path
WIN 8:
Delphi-Quellcode:
Hinweis:
uses
ActiveX, ShlObj; function SpecialDirectory(const iID: Integer): string; var aPath : array[0..MAX_PATH] of Char; pilTemp: PItemIDList; begin try if SHGetSpecialFolderLocation(0, iID, pilTemp)=S_OK then begin if SHGetPathFromIDList(pilTemp, aPath) then begin Result := string(aPath); end else Result := ''; CoTaskMemFree(pilTemp); end else Result := ''; except Result := ''; end; end; function GetConfigPath: String; var AppDir: String; begin AppDir := SpecialDirectory(CSIDL_APPDATA)+'\ProgName'; if DirectoryExists(AppDir) = false then mkdir(AppDir); result := AppDir+'\'; end; //ergibt: C:\Users\HATHOR\AppData\Roaming\ProgName\ Über den WIN8-Explorer kommt man nur hin, wenn man C:\Users\HATHOR\AppData\Roaming\ProgName\ direkt in die Adresszeile eingibt. Alternativ: Im Explorer - Ansicht - Häkchen bei Ausgeblendete Elemente |
AW: Application Path
Und davor (rausgeschnibbelt aus einer größeren Unit)
Delphi-Quellcode:
So, und wer jetzt seine INI ins Programmverzeichnis schmeißt, wird geteert und gefeedert (mit Doppel-E!). :mrgreen:
unit SettingsPaths;
interface Function LocalUserFilesPath: String; Function LocalAppDataPath(AppName: String): String; Function AppDataPath(AppName: String): String; implementation Uses sysutils,windows,ShlObj, ActiveX; Function GetSpecialFolderLocation(csidl: integer): String; Var pMalloc: IMalloc; pidl: PItemIDList; path: Array[0..MAX_PATH] Of Char; Begin Result := '?'; If SHGetMalloc(pMalloc) = S_OK Then Begin SHGetSpecialFolderLocation(0, csidl, pidl); SHGetPathFromIDList(pidl, path); Result := IncludeTrailingPathDelimiter(Path); pMalloc.Free(pidl); End; End; Function LocalUserFilesPath: String; Begin Result := IncludeTrailingPathDelimiter(GetSpecialFolderLocation(CSIDL_PERSONAL)); End; Function LocalAppDataPath(AppName: String): String; Begin Result := IncludeTrailingPathDelimiter(GetSpecialFolderLocation(CSIDL_LOCAL_APPDATA)); Result := IncludeTrailingPathDelimiter(Result + AppName); ForceDirectories(Result) End; Function AppDataPath(AppName: String): String; Begin Result := IncludeTrailingPathDelimiter(GetSpecialFolderLocation(CSIDL_APPDATA)); Result := IncludeTrailingPathDelimiter(Result + AppName); ForceDirectories(Result) End; end. |
AW: Application Path
![]() Zitat:
![]() Zitat:
![]() Zitat:
![]() Einziger Haken: Zitat:
|
AW: Application Path
Oh, nie drauf geachtet.
|
AW: Application Path
Zitat:
|
AW: Application Path
Zitat:
|
AW: Application Path
Ergebnis des untenstehenden Codes:
C:\Users\HATHOR\AppData\Roaming\MyProg
Delphi-Quellcode:
function GetMyPath: string;
var LStr: array[0 .. MAX_PATH] of Char; s, AppDir : String; begin Result:=''; Application.Name:='MyProg'; s:= PathDelim + Application.Name; SetLastError(ERROR_SUCCESS); if SHGetFolderPath(0, CSIDL_APPDATA, 0, 0, @LStr) = S_OK then AppDir:= LStr +s; Result := AppDir; if not DirectoryExists(AppDir) then mkdir(AppDir); end; |
AW: Application Path
Was ändert sich, und was soll daran ein Delphi-Problem sein? ParamStr(0) bzw. Application.Exename enthalten den vollen Pfad zum Programm, und zwar da, wo es tatsächlich liegt. Dass dieses Verzeichnis ggf. anders heißt als vom Windows-Explorer dargestellt, liegt nicht an Delphi, sondern an der Virtualisierung bestimmter Ordner seitens Microsoft.
|
AW: Application Path
Zitat:
Es könnte durchaus Möglichkeiten geben das von dir gewünschte Ergebnis dem Benutzer anzuzeigen. Intern darfst du mit dem was der Windows Explorer (und dann ggf. du) dem Benutzer anzeigt, aber nicht arbeiten, da die Verzeichnisse so gar nicht immer existieren. |
AW: Application Path
Liste der Anhänge anzeigen (Anzahl: 1)
Welche Verzeichnisse betrifft denn das nochmal?
Ach ja: - Programm in ein Unterverzeichnis legen und dann in einer Batchdatei oder in der Konsole, vom übergeordnetem Verzeichnis aus
Delphi-Quellcode:
aufrufen
"Unterverzeichnis\Project19.exe"
- oder in einer Verknüpfung mal bei "Ausführen in" ein anderes Arbeitsverzeichnis angeben - oder bei ShellExecute und Co. bei lpFile die EXE aufrufen, samt vollständigem Pfad, und bei lpDirectory ein anderes Arbeitsverzeichnis angeben Die Unterscheidung zwischen Arbeitsvereichnis und Programmverzeichnis gibt es schon seit DOS So konnte man z.B. ein Programm da ablegen und z.B. dem Packprogramm sagen, daß es "hier" (im Arbeitsverzeichnis) alle Dateien packen soll
Code:
(über Suchpfade die EXE suchen lassen)
pack.exe -p *.* a.zip
oder
Code:
Und das Programm holte sich "seine" Dateien aus seinem Programmverzeichnis (wenn es ordentlich programmiert ist), aber arbeitet mit den Dateien im Arbeitsverzeichnis.
c:\program\myprog\pack.exe -p *.* a.zip
|
AW: Application Path
Zitat:
Analog zu deinem Beitrag #7 habe ich mal ein Testprogramm gemacht. (Nur eine Form mit einem Label drauf). Im OnShow dann
Delphi-Quellcode:
LabelDir.Caption:=ExtractFilePath(Application.ExeName);
Egal, ob ich das nach C:\Users\Userx\Downloads\Irgendwas oder sonst irgendwohin kopiere, es wird erwartungsgemäß immer das Verzeichnis angezeigt, in dem die Exe liegt. <DummeFrage> Hast du vielleicht nicht die Exe kopiert, sondern nur eine Verknüpfung angelegt? </DummeFrage> |
AW: Application Path
Zitat:
Zitat:
MfG Dalai |
AW: Application Path
Gibt es hier eigentlich einen Ersatz mit TPATH.GET meinen Programmpath :?:
|
AW: Application Path
Zitat:
und sogar bereits die ersten Windows10-Versionen End-of-Life. (bei Amazon kann ich noch Win7 kaufen, aber die "günstigen" Windows 10 gibt es schon nicht mehr ... mußte letzten Freitag zu eBay gehn) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:06 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