VC 对话框程序怎么调用一个控制台程序,然后这个控制台程序关闭原来的对话框程序,在开一个新的对话框程
如题,其实就是一个更新的功能,a.exe(对话框)调用b.exe(控制台),b.exe去关闭a.exe,b.exe再启动c.exe...
如题,其实就是一个更新的功能,a.exe(对话框)调用b.exe(控制台),b.exe去关闭a.exe,b.exe再启动c.exe
展开
2个回答
展开全部
按照你说的方法:
a.exe调用GetCurrentProcess获取当前进程的句柄,然后DuplicateHandle把伪句柄转成真句柄,然后SetHandleInformation使它可以被继承(为的是b.exe可以成功关闭a.exe)。之后CreateProcess启动b.exe,继承句柄那个参数记得要TRUE,命令行参数可以把刚刚说的那个真句柄传进去。然后b.exe从命令行参数获取到句柄,调用TerminateProcess强制关闭这个进程,然后CloseHandle关闭句柄。随后b.exe调用CreateProcess启动c.exe,启动后b.exe退出。
问题在于TerminateProcess对于进程的正常结束很不好,如果程序中有什么东西没保存啊啥的就都没了。
我想的另一个方法:
a.exe不是把自己的句柄传给b.exe而是创建一个互斥体(CreateMutex),然后设置为可继承,之后获取互斥体(WaitForSingleObject),然后创建b.exe,之后b.exe在这个互斥体上等待,a.exe自己主动退出(而不是由b.exe去结束)。一旦a.exe退出,b那边的WaitForSingleObject就会返回abandoned,然后b.exe关闭互斥体对象,CreateProcess去开c.exe
总之你需要弄清楚这些继承机制啊啥的,这种方法比直接枚举进程然后根据进程名打开进程再去关闭什么什么的可靠多了,避免了打开进程会失败的情况,而且因为b是a的子进程,还是用CreateProcess创建的,那么也最大限度避免了a无法成功打开b进程的问题。句柄都是靠继承的方式传递的,避免了对象打开失败的问题
a.exe调用GetCurrentProcess获取当前进程的句柄,然后DuplicateHandle把伪句柄转成真句柄,然后SetHandleInformation使它可以被继承(为的是b.exe可以成功关闭a.exe)。之后CreateProcess启动b.exe,继承句柄那个参数记得要TRUE,命令行参数可以把刚刚说的那个真句柄传进去。然后b.exe从命令行参数获取到句柄,调用TerminateProcess强制关闭这个进程,然后CloseHandle关闭句柄。随后b.exe调用CreateProcess启动c.exe,启动后b.exe退出。
问题在于TerminateProcess对于进程的正常结束很不好,如果程序中有什么东西没保存啊啥的就都没了。
我想的另一个方法:
a.exe不是把自己的句柄传给b.exe而是创建一个互斥体(CreateMutex),然后设置为可继承,之后获取互斥体(WaitForSingleObject),然后创建b.exe,之后b.exe在这个互斥体上等待,a.exe自己主动退出(而不是由b.exe去结束)。一旦a.exe退出,b那边的WaitForSingleObject就会返回abandoned,然后b.exe关闭互斥体对象,CreateProcess去开c.exe
总之你需要弄清楚这些继承机制啊啥的,这种方法比直接枚举进程然后根据进程名打开进程再去关闭什么什么的可靠多了,避免了打开进程会失败的情况,而且因为b是a的子进程,还是用CreateProcess创建的,那么也最大限度避免了a无法成功打开b进程的问题。句柄都是靠继承的方式传递的,避免了对象打开失败的问题
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询