【问题标题】:How can I detect if the exe name has changed since the process was started如何检测自进程启动后 exe 名称是否已更改
【发布时间】:2011-06-13 08:37:09
【问题描述】:

我们有一个自动更新的 Delphi 应用程序,当我们更新程序时,我们会更改当前的 exe 名称并将其更新版本放在同一文件夹中。这有一些很大的好处,并确保程序下次运行时,将调用更新的版本。

话虽如此,如果我还可以调用以检查正在运行的进程是否链接到具有正确名称的 exe,或者是否发生了更新,那就太好了。

有人知道如何识别吗?

提前致谢。

【问题讨论】:

  • 在我看来,如果您知道您正在更新可执行文件,那么您就知道它已被更新。如果这是一个进程外的事情,那么你最好的选择是定期检查版本号(即每小时),并用通知区域图标通知他们。

标签: delphi winapi


【解决方案1】:

我认为您必须使用带有 FILE_NOTIFY_CHANGE_FILE_NAME 过滤器的 FindFirstChangeNotification API(请参阅MSDN)设置更改通知对象。然后,当您收到通知时,请检查它是否与您的 exe 有关并采取适当的措施。 有可用的组件封装了这个 API,即如果你安装了JVCL,那么我很确定它有一个。

【讨论】:

    【解决方案2】:

    如果进程正在运行,则无法重命名其可执行文件 AFAIK。所以我不明白你的问题的重点。

    要检查正在运行的 exe 版本,请使用 GetVersion API 并检索其版本号。

    【讨论】:

    • 如果您设置了IMAGE_FILE_NET_RUN_FROM_SWAP PE 图像标志,您可以重命名文件。奇怪的是,您还可以重命名正在运行的可执行文件,但不能删除它。
    • 正如 Ian 所说,您可以重命名,因为这是我们更新周期的全部原则,它的运作就像一场梦。
    • @all 你说得对:我没有测试它,因为它听起来对我来说太奇怪了......
    【解决方案3】:

    您可以使用GetCurrentProcessId() 获取您传递给OpenProcess() 的PID。然后,您可以使用GetModuleFileNameEx() 获取该位置的完全限定路径。我想您有某种文件层次结构/命名约定,您可以使用它来确定当前的 exe 是否是最新的。 PathStripPath() 可能很方便或其他一些path functions

    【讨论】:

    • 我不一定认为这会有所帮助,但是 GetCurrentProcessId、OpenProcess 和最后的 GetModuleFileNameEx 对于获取模块文件名来说太过分了。只需调用 GetModuleFileName 并将 NULL 作为 HMODULE 传递。
    • 杜赫时刻 :) 你是对的。我太习惯在属于其他进程的模块上使用该功能了。
    • 我不确定 GetModuleFileName 和其他“进程信息例程”在这种情况下是否有效 - 我希望它们返回原始文件名,而不是更新后的文件名。但是我没有测试过...
    【解决方案4】:

    Delphi 的一个简单方法是使用 ParamStr(0) - 它具有 exe 的完整路径和文件名。在程序启动时存储 exe 文件的 DateTimeStamp。然后定期检查是否有变化...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      相关资源
      最近更新 更多