【发布时间】:2021-08-23 06:03:32
【问题描述】:
是否可以在 Windows 10 中调用 CreateProcess() 并确保它启动与当前进程完全相同的可执行文件,即使当前可执行文件可以随时重命名?例如,如果当前进程的可执行文件最初名为name.exe,但随后在进程运行时将其重命名为name_old.exe,那么子进程应该使用name_old.exe?
我可以使用QueryFullProcessImageName() 检测当前进程的名称更改。问题是这不是原子的,因为重命名可能恰好发生在该调用和CreateProcess之间。
这样做的背景是我们正在为我们的应用程序实施实时更新。更新过程在检测到应用程序可执行文件正在使用时,将可执行文件重命名为name_old.exe,然后将新版本复制为name.exe。然后,当用户使用name_old.exe 关闭应用程序的最后一个实例时,旧版本将被删除。
这几乎可行。问题是应用程序启动了子工作进程。那些应该使用与主应用程序完全相同的可执行文件,因为更新可以改变父子交互的协议。所以我们必须防止子进程使用新的可执行文件,而父进程使用旧的可执行文件。
【问题讨论】:
-
如果您的通信协议允许中断更改,为什么没有实施版本控制方案?这似乎是您要解决的真正问题。
-
为严格的本地 IPC 对协议进行版本控制比确保实时更新正常工作要复杂得多。在最坏的情况下,如果我们没有找到解决问题的方法,我们可能会在更新过程和主应用程序之间添加一些通信。
-
奇数。您不知道如何解决特定问题,但确信其解决方案比已解决问题的解决方案简单。
-
我们确实知道如何创建解决方法。例如,更新过程可以向应用程序发送一个即将重命名可执行文件的事件,并等待应用程序确认,然后重命名可执行文件。收到信号后,应用程序会等待直到可执行文件被重命名,然后再创建新的子进程。但这需要更新程序和应用程序之间的合作,这使得更新过程不那么健壮。
标签: winapi createprocess