2014-06-18 4 views
5

내 exe 경로를 확인하기 위해 어떤 코드를 사용해야하는지 잘 모릅니다. 나에게 설명 할 때를주고 우리가 왜 사용해야하십시오 :Delphi 파일 위치 얻기

1ExtractFilePath(ParamStr(0))

2ExtractFilePath(Application.ExeName)

을 모두 코드는 동일한 출력을 렌더링하기 때문에.

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

'Application.ExeName' getter는 내부적으로'ParamStr (0)'을 호출합니다. – TLama

+0

그래서 옵션 2가 항상 선호됩니까? – Bianca

+1

그건 아무도 말할 수없는 것입니다. 'Application' 객체 ('Forms' 단위를 포함하고 응용 프로그램이 VCL 양식 응용 프로그램을 필요로 함)에 의존하기를 원하지 않으면'ParamStr (0)'을 사용하십시오. VCL 양식 응용 프로그램을 가지고 있고'Forms' 단위를 포함하고 싶다면 더 읽기 쉬운'Application.ExeName'을 사용할 수 있습니다. 나는'ParamStr (0)'을 선호한다. – TLama

답변

9

둘 다 동일한 결과를 제공하지만 미묘한 차이가 있습니다.

Application.ExeName은 VCL Application 개체를 참조합니다. 이 속성을 사용하려면 Vcl.Forms 유닛을 사용해야합니다. 내부적으로 이것은 ParamStr (0) 함수를 호출합니다.

FireMonkey TApplication 클래스에는이 속성이 없습니다 (XE5 기준). 따라서 FireMonkey를 사용하는 경우 Application.ExeName을 호출 할 수 없습니다. 그리고 VCL 프로젝트를 FireMonkey로 마이그레이션했다면 이것을 다시 작성해야합니다.

ParamStr 함수 OTOH는 시스템 단위이며 다중 플랫폼입니다 (사용중인 Delphi 버전의 OC에 따라 Win, Mac, iOS 및 Android). Windows에서 ParamStr (0)은 GetModuleFileName 함수를 호출하고 다른 플랫폼에서는 실행 파일의 전체 경로와 이름이어야하는 첫 번째 토큰을 반환하는 명령 줄을 구문 분석합니다. (이 수정에 대해 Rob Kennedy에게 감사)

그래서 ... ParamStr (0)을 직접 사용하는 것이 좋습니다.

+0

@frazz, 매우 명확한 설명을 주셔서 감사합니다. 매우 고맙습니다;) – Bianca

+0

'ParamStr (0)'은 "실행 명령의 첫 번째 매개 변수"를 반환하지 않습니다. Unix와 C의'argv' 배열에 대해 생각하고 있습니다. OS와 런타임은'execv'에 전달 된 임의의 값을 단순히 전달하며, 프로그램 이름이기를 희망합니다. Delphi에서이 함수는 특별히 0을 처리하고'GetModuleFileName'을 호출하여 EXE 파일의 이름을 직접 가져옵니다 (Windows에서는 어쨌든, 다른 플랫폼에서는 그 구현을 알지 못합니다). –

+0

지적 해 주셔서 고맙습니다. 코드를 확인하고 답변을 업데이트했습니다. – Frazz

1

기능적으로 동일합니다. Forms 유닛의 오버 헤드와 모든 수하물을 원하지 않는다면 ParamStr(0)을 사용할 것입니다.