Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何检测进程启动后exe名称是否已更改_Delphi_Winapi - Fatal编程技术网

Delphi 如何检测进程启动后exe名称是否已更改

Delphi 如何检测进程启动后exe名称是否已更改,delphi,winapi,Delphi,Winapi,我们有一个自动更新的Delphi应用程序,当我们更新程序时,我们会更改当前的exe名称,并将其更新版本放在同一文件夹中。这有一些很大的好处,并确保在下次运行程序时,将调用更新的版本 话虽如此,如果我也能打电话检查运行的进程是否链接到具有正确名称的exe,或者是否发生了更新,那就太好了 有人知道如何识别这个吗 提前感谢。我认为您必须使用带有文件名过滤器的FindFirstChangeNotification API(请参阅)设置更改通知对象。然后,当您收到通知时,检查它是否与您的exe有关,并采取

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

话虽如此,如果我也能打电话检查运行的进程是否链接到具有正确名称的exe,或者是否发生了更新,那就太好了

有人知道如何识别这个吗


提前感谢。

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

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


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

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

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

我不一定认为这会有所帮助,但GetCurrentProcessId、OpenProcess和最后GetModuleFileNameEx在获取模块文件名方面做得太过分了。只需调用GetModuleFileName并将NULL作为HMODULE传递。Duhhh:)您是对的。我太习惯于在属于其他进程的模块上使用该函数了。我不确定GetModuleFileName和其他“进程信息例程”在这种情况下是否可以工作-我希望它们返回原始文件名,而不是更新后的文件名。但是我还没有测试过…如果您设置了
IMAGE\u file\u NET\u RUN\u FROM\u SWAP
PE IMAGE标志,则可以重命名文件。Bizarry您还可以重命名正在运行的可执行文件,但不能删除它。正如Ian所说,您可以重命名,因为这是我们更新周期的全部原则,它工作起来就像一场梦。@您说得对:我没有测试它,因为它听起来太奇怪了……在我看来,如果您知道您正在更新可执行文件,那你就知道它已经更新了。如果是进程外事件,那么最好的选择是定期检查版本号(即每小时),并使用通知区域图标通知他们。