2014-06-18 17 views
5

Um meinen Exe-Pfad zu ermitteln, weiß ich nicht, welchen Code ich verwenden soll. Bitte geben Sie mir erklären, wann und warum sollten wir verwenden:Delphi Abrufen der Dateiposition

1.ExtractFilePath(ParamStr(0))

2.ExtractFilePath(Application.ExeName)

Da beide Code, um die gleiche Leistung zu machen.

C:\Users\Bianca\Documents\RAD Studio\Projects\Exam1\Win32\Release\ 
C:\Users\Bianca\Documents\RAD Studio\Projects\Exam1\Win32\Release\ 
+3

'Getter des Application.ExeName' ruft intern' ParamStr (0) 'auf. – TLama

+0

Also, Option 2 wird immer bevorzugt? – Bianca

+1

Das kann niemand sagen. Wenn Sie sich nicht auf das 'Application'-Objekt verlassen wollen (das eine' Forms'-Einheit enthalten muss und Ihre Anwendung die VCL-Formularanwendung sein muss), verwenden Sie 'ParamStr (0)'. Wenn Sie eine VCL-Formularanwendung haben und es Ihnen nichts ausmacht, die 'Forms'-Einheit einzubeziehen, können Sie einen besser lesbaren' Application.ExeName' verwenden. Ich bevorzuge 'ParamStr (0)'. – TLama

Antwort

9

Sie beide geben Ihnen das gleiche Ergebnis, aber es gibt feine Unterschiede.

Application.ExeName verweist auf das VCL-Anwendungsobjekt. Für die Verwendung dieser Eigenschaft müssen Sie die Vcl.Forms-Einheit verwenden. Intern ruft dies die ParamStr (0) -Funktion auf.

Beachten Sie, dass die FireMonkey TApplication-Klasse diese Eigenschaft nicht hat (ab XE5). Daher können Sie Application.ExeName nicht aufrufen, wenn Sie FireMonkey verwenden. Und wenn Sie jemals ein VCL-Projekt zu FireMonkey migrieren, müssen Sie dies neu schreiben.

Die ParamStr-Funktion OTOH ist die Systemeinheit und ist eine Multiplattform (Win, Mac, iOS und Android, abhängig von der von Ihnen verwendeten Delphi-Version). Unter Windows ruft ParamStr (0) die Funktion GetModuleFileName auf, während sie auf den anderen Plattformen die Befehlszeile analysiert, wobei das erste Token zurückgegeben wird, das den vollständigen Pfad und den Namen der ausführbaren Datei enthalten muss. (Dank an Rob Kennedy für diese Korrektur)

Also ... Ich würde vorschlagen, dass Sie ParamStr (0) direkt verwenden.

+0

Danke @frazz, sehr klare Erklärung. Sehr schätze das;) – Bianca

+0

'ParamStr (0)' gibt nicht den "ersten Parameter des Ausführungsbefehls" zurück. Sie denken an das "argv" -Array von Unix und C, wo das Betriebssystem und die Laufzeit einfach jeden beliebigen Wert an "execv" weiterleiten, mit der Hoffnung, dass es der Programmname ist. In Delphi behandelt die Funktion 0 und ruft 'GetModuleFileName' auf, um den Namen der EXE-Datei direkt abzurufen (unter Windows sowieso; ich kenne seine Implementierung für andere Plattformen nicht). –

+0

Danke, dass Sie darauf hingewiesen haben, ich habe den Code überprüft und die Antwort aktualisiert. – Frazz

1

Sie sind funktionell identisch. Sie würden ParamStr(0) verwenden, wenn Sie nicht den Overhead der Forms Einheit und alles es Gepäck wollen.

Verwandte Themen