Delphi获取文件位置

12

要确定我的exe路径,我不知道应该使用哪个代码。 请告诉我何时以及为什么我们应该使用:

1. ExtractFilePath(ParamStr(0))

2. ExtractFilePath(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 的获取方法内部调用了 ParamStr(0) - TLama
那么,选项2总是首选吗? - Bianca
1
这是没有人能说清楚的。如果您不想依赖Application对象(需要包括Forms单元并要求您的应用程序是VCL表单应用程序),请使用ParamStr(0)。如果您有一个VCL表单应用程序,并且不介意包括Forms单元,您可以使用更易读的Application.ExeName。我更喜欢ParamStr(0) - TLama
1
谢谢@TLama,现在我明白了。;) - Bianca
我认为如果应用程序在网络共享上,ParamStr(0)的性能表现不佳。 - user763539
2个回答

16

它们都会给出相同的结果,但是存在细微的差异。

Application.ExeName 引用 VCL 应用程序对象。使用此属性需要使用 Vcl.Forms 单元。内部实际上调用了 ParamStr(0) 函数。

值得注意的是 FireMonkey TApplication 类没有这个属性(至少在 XE5 中没有)。因此,如果你使用 FireMonkey,就不能调用 Application.ExeName。而且,如果你将 VCL 项目迁移到 FireMonkey,你将不得不重写这个属性。

另一方面,ParamStr 函数位于 System 单元中,并且是跨平台的(适用于 Win、Mac、iOS 和 Android,具体取决于所使用的 Delphi 版本)。在 Windows 上,ParamStr(0) 调用 GetModuleFileName 函数,而在其他平台上,它解析命令行并返回第一个标记,该标记应该是正在运行的可执行文件的完整路径和名称。(感谢 Rob Kennedy 进行更正)

因此,建议直接使用 ParamStr(0)。


谢谢@frazz,解释得非常清楚。非常感激这个;) - Bianca
1
ParamStr(0) 不会返回“执行命令的第一个参数”。你可能在想 Unix 和 C 的 argv 数组,在那里操作系统和运行时只是简单地转发了传递给 execv 的任意值,并希望它是程序名称。在 Delphi 中,该函数将 0 特殊处理,并调用 GetModuleFileName 直接获取 EXE 文件的名称(至少在 Windows 上是这样;我不知道其他平台的实现方式)。 - Rob Kennedy
谢谢指出,我已经检查了代码并更新了答案。 - Frazz

1
它们在功能上是相同的。如果你不想要Forms单元和所有相关内容的开销,你可以使用ParamStr(0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接