【问题标题】:Delphi Get file locationDelphi 获取文件位置
【发布时间】:2014-06-18 09:51:41
【问题描述】:

要确定我的 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\

【问题讨论】:

  • Application.ExeName getter 内部调用 ParamStr(0)
  • 那么,选项 2 总是首选?
  • 这是没有人能说的。如果您不想依赖Application 对象(需要包含Forms 单元并要求您的应用程序是VCL 表单应用程序),请使用ParamStr(0)。如果您有一个 VCL 表单应用程序,并且不介意包含 Forms 单元,则可以使用可读性更好的 Application.ExeName。我更喜欢ParamStr(0)
  • 谢谢@TLama 现在我很清楚了。 ;)
  • 我认为如果应用程序在网络共享上,ParamStr(0) 不会很好地执行。

标签: delphi path


【解决方案1】:

它们都给你相同的结果,但有细微的差别。

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

请注意,FireMonkey TApplication 类没有此属性(从 XE5 开始)。因此,如果您使用 FireMonkey,则不能调用 Application.ExeName。如果你曾经将 VCL 项目迁移到 FireMonkey,你将不得不重写它。

ParamStr 函数 OTOH 是系统单元并且是多平台的(Win、Mac、iOS 和 Android,取决于您使用的 Delphi 版本的 OC)。在 Windows 上 ParamStr(0) 调用 GetModuleFileName 函数,而在其他平台上,它解析返回第一个标记的命令行,该标记应该是完整路径和正在运行的可执行文件的名称。 (感谢 Rob Kennedy 的更正)

所以...我建议你直接使用 ParamStr(0)。

【讨论】:

  • 谢谢@frazz,非常清楚的解释。非常感谢;)
  • ParamStr(0) 不返回“执行命令的第一个参数”。您正在考虑 Unix 和 C 的 argv 数组,其中操作系统和运行时简单地将任何任意值转发给 execv,希望它是程序名称。在Delphi中,该函数对0进行特殊处理,并调用GetModuleFileName直接获取EXE文件的名称(在Windows上,反正我不知道它在其他平台上的实现)。
  • 感谢指出,我已经检查了代码并更新了答案。
【解决方案2】:

它们在功能上是相同的。如果您不想要 Forms 单元的开销和所有它的包袱,您将使用 ParamStr(0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多