2014-06-18 20 views
5

Per determinare il mio percorso exe, non so quale codice dovrei usare. Per favore dammi una spiegazione quando e perché dovremmo usare:Delphi Ottieni posizione file

1.ExtractFilePath(ParamStr(0))

2.ExtractFilePath(Application.ExeName)

Poiché sia ​​il codice sono rendering lo stesso output.

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

'getter Application.ExeName' chiama internamente' ParamStr (0) '. – TLama

+0

Quindi, l'opzione 2 è sempre preferita? – Bianca

+1

Questo è quello che nessuno può dire. Se non vuoi fare affidamento sull'oggetto 'Applicazione' (che deve includere l'unità' Forms' e richiede che l'applicazione sia l'applicazione di moduli VCL), usa 'ParamStr (0)'. Se si dispone di un'applicazione per moduli VCL e non si è disposti a includere l'unità 'Forms', è possibile utilizzare un' Application.ExeName' più leggibile. Preferisco 'ParamStr (0)'. – TLama

risposta

9

Entrambi danno lo stesso risultato, ma ci sono sottili differenze.

Application.ExeName fa riferimento all'oggetto dell'applicazione VCL. L'utilizzo di questa proprietà richiede l'utilizzo dell'unità Vcl.Forms. Internamente ciò chiama la funzione ParamStr (0).

Si noti che la classe TApplication FireMonkey non ha questa proprietà (come XE5). Quindi non puoi chiamare Application.ExeName se stai usando FireMonkey. E se dovessi mai migrare un progetto VCL in FireMonkey, dovrai riscriverlo.

La funzione ParamStr OTOH è l'unità di sistema ed è multipiattaforma (Win, Mac, iOS e Android, in base all'OC nella versione Delphi in uso). In Windows ParamStr (0) chiama la funzione GetModuleFileName, mentre sulle altre piattaforme analizza la riga di comando che restituisce il primo token, che dovrebbe essere il percorso completo e il nome dell'eseguibile in esecuzione. (Grazie a Rob Kennedy per questa correzione)

Quindi ... Suggerisco di utilizzare direttamente ParamStr (0).

+0

Grazie @frazz, spiegazione molto chiara. Molto apprezzato;) – Bianca

+0

'ParamStr (0)' non restituisce il "primo parametro del comando di esecuzione". Stai pensando all'array 'argv' di Unix e C, dove il sistema operativo e il runtime inoltrano semplicemente qualsiasi valore arbitrario passato a' execv', con la speranza che sia il nome del programma. In Delphi, la funzione tratta specificamente 0 e chiama 'GetModuleFileName' per recuperare direttamente il nome del file EXE (su Windows, comunque, non conosco la sua implementazione per altre piattaforme). –

+0

Grazie per averlo segnalato, ho controllato il codice e aggiornato la risposta. – Frazz

1

Sono funzionalmente identici. Useresti ParamStr(0) se non volevi il sovraccarico dell'unità Forms e tutto il suo bagaglio.

Problemi correlati