2015-05-31 70 views
0

我有两个应用程序。他们两人使用相同的资源。让我们称这些资源为“个人资料资源”。在应用程序A关闭之前,应用程序B无法启动。所以我有应用程序A运行并试图关闭它,然后启动应用程序B路径。我探索了RegisterApplicationRestart,但我无法完成。这是可能做到的吗?我陷在其中,申请A是关闭的位置,然后我不能运行任何代码,发动回到应用程序B.RegisterApplicationRestart与不同的路径

+1

如果应用程序正常终止,'RegisterApplicationRestart'将不会执行重新启动。它不是为了这样做而设计的。你有错误的功能。我的猜测是,App A和App B都是firefox.exe,所以你可能需要一个单独的可执行文件。 –

+1

此外,如果应用程序异常终止或挂起,触发重新启动,将提示用户是否实际执行重新启动。仅当操作系统使用EWX_RESTARTAPPS标志重新引导时,才会自动重新注册应用程序,例如由需要替换正在运行的应用程序上的文件的安装程序。 –

+0

嗨@DavidHeffernan非常感谢yep我的用户所做的是他们有firefox.exe和firefox_beta.exe和firefox_alpha.exe,然后是firefox_nightly.exe,他们正在运行firefox.exe点击了一个按钮重新启动Firefox到Firefox _ ** *。可执行程序。目前我有一个目标设置为firefox.exe的快捷方式文件,因此当他们将版本更改为beta时,我更改了快捷方式的目标,然后我需要在关机后重新启动该快捷方式。 – Noitidart

回答

1

A可以退出之前使用CreateProcess()推出B,通过它自己的进程句柄B。在B访问资源之前,它可以使用WaitForSingleObject()或相关函数等待A的句柄。当手柄发信号时,A已完全终止,因此B可以使用CloseHandle()关闭手柄并根据需要继续。

要传递A的处理句柄BA可以:

  1. 打开使用OpenProcess()它自己的进程手柄GetCurrentProcessId()进程ID,标记使用SetHandleInformation()手柄为可继承,再通将B的句柄值作为命令行参数,将bInheritHandles参数CreateProcess()设置为TRUE。

  2. 运行B第一,并将它创建一个IPC监听器(命名管道,邮筒,插座等),然后A可以复制的B自己的进程句柄的通过DuplicateHandle()使用与GetCurrentProcess()作为源手柄和B“ (从CreateProcess())作为目标进程,然后通过IPC将重复句柄值发送到B

一种更简单的技术是有A通过它自己的进程ID,而不是它的处理句柄,以B作为命令行参数,然后B可以使用OpenProcess()打开A的处理句柄。虽然这通常会工作,但它有一个小的竞争条件 - B有机会打开进程句柄之前,A可能会终止与OS可以重用它的进程ID为新的不相关的进程,从而B会得到一个句柄,并等待,错误的过程。

+0

谢谢@Remy!我会测试这个并报告ba CK!编辑:啊,我没有控制应用程序B.只有应用程序A是我的,这仍然工作? – Noitidart

+1

是的,稍作修改。 'A'可以运行自己的另一个副本,可以等待原始文件退出,如上所述,然后再运行'B'。 ''A''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' –

+0

谢谢@Remy!将测试:) – Noitidart

相关问题