2014-06-18 19 views
5

Aby określić swoją ścieżkę exe, nie wiem, który kod powinienem użyć. Proszę dać mi wyjaśnienie, kiedy i dlaczego powinniśmy używać:Delphi Pobierz lokalizację pliku

1.ExtractFilePath(ParamStr(0))

2.ExtractFilePath(Application.ExeName)

Ponieważ zarówno kod renderowania są taką samą moc.

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

'Nazwa aplikacji" Nazwa_wyróżnienia' getter wewnętrznie wywołuje 'ParamStr (0)'. – TLama

+0

A więc opcja 2 jest zawsze preferowana? – Bianca

+1

Tego nie można powiedzieć. Jeśli nie chcesz polegać na obiekcie 'Application' (który musi zawierać jednostkę' Forms' i wymaga, aby twoja aplikacja była aplikacją formularzy VCL), użyj 'ParamStr (0)'. Jeśli korzystasz z aplikacji formularzy VCL i nie masz nic przeciwko dołączeniu jednostki "Forms", możesz użyć lepiej odczytywanego 'Application.ExeName'. Wolę 'ParamStr (0)'. – TLama

Odpowiedz

9

Oba dają taki sam wynik, ale istnieją subtelne różnice.

Application.ExeName odwołuje się do obiektu aplikacji VCL. Korzystanie z tej właściwości wymaga użycia jednostki Vcl.Forms. Wewnętrznie to wywołuje funkcję ParamStr (0).

Należy zauważyć, że klasa FireMonkey TApplication nie ma tej właściwości (od XE5). Więc nie możesz wywołać Application.ExeName, jeśli używasz FireMonkey. A jeśli kiedykolwiek zmigrowałeś projekt VCL do FireMonkey, będziesz musiał to napisać ponownie.

Funkcja ParamStr OTOH jest jednostką systemową i jest wieloplatformowa (Win, Mac, iOS i Android, zależna wersja OC w używanej wersji Delphi). W systemie Windows ParamStr (0) wywołuje funkcję GetModuleFileName, podczas gdy na innych platformach analizuje wiersz polecenia zwracając pierwszy token, który powinien być pełną ścieżką i nazwą uruchomionego pliku wykonywalnego. (Dzięki Robowi Kennedy'emu za tę korektę)

Tak ... Sugeruję, abyś użył ParamStr (0) bezpośrednio.

+0

Dziękuję @frazz, bardzo jasne wyjaśnienie. Bardzo to doceniamy;) – Bianca

+0

'ParamStr (0)' nie zwraca "pierwszego parametru polecenia wykonania". Myślisz o tablicy 'argv' Uniksa i C, gdzie system operacyjny i środowisko wykonawcze po prostu przekazują dowolną wartość przekazaną do' execv', z nadzieją, że jest to nazwa programu. W Delphi funkcja traktuje 0 specjalnie i wywołuje 'GetModuleFileName', aby bezpośrednio pobrać nazwę pliku EXE (w każdym razie na Windowsie, nie znam jego implementacji dla innych platform). –

+0

Dzięki za wskazanie, sprawdziłem kod i zaktualizowałem odpowiedź. – Frazz

1

Są funkcjonalnie identyczne. Możesz użyć ParamStr(0), jeśli nie chcesz, aby obciążenie jednostki Forms i całego jej bagażu.

Powiązane problemy