Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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
C++ 在子窗口(C+;+;,win32)中执行外部exe_C++_Winapi - Fatal编程技术网

C++ 在子窗口(C+;+;,win32)中执行外部exe

C++ 在子窗口(C+;+;,win32)中执行外部exe,c++,winapi,C++,Winapi,我已经写了一个简单的win32程序,比如abc.exe 我在其中添加了一个按钮,单击该按钮可以启动外部exe比如xyz.exe 但是当运行xyz.exe时,应无法访问原始程序,即abc.exe。(与消息框的情况相同,父窗口保持不活动状态,除非消息框关闭) 我该怎么做呢? 如果您可以发布一个示例代码,那就太好了。您可以使用WaitForSingleObject(IIRC)等待新进程终止。您可以在等待之前使窗口不可见(例如,通过ShowWindow)。首先检查成功启动。按下按钮后,使用CreateP

我已经写了一个简单的win32程序,比如abc.exe

我在其中添加了一个按钮,单击该按钮可以启动外部exe比如
xyz.exe

但是当运行
xyz.exe
时,应无法访问原始程序,即
abc.exe
。(与消息框的情况相同,父窗口保持不活动状态,除非消息框关闭)

我该怎么做呢?
如果您可以发布一个示例代码,那就太好了。

您可以使用
WaitForSingleObject
(IIRC)等待新进程终止。您可以在等待之前使窗口不可见(例如,通过
ShowWindow
)。首先检查成功启动。

按下按钮后,使用
CreateProcess
函数创建“xyz.exe”进程,并保存新进程”句柄(
process\u信息中的
hProcess
结构中传递的
CreateProcess

然后,您可以通过调用
EnableWindow
禁用“abc.exe”窗口,并将
bEnable
设置为
FALSE

在“abc.exe”的窗口过程中,处理
WM_PAINT
消息的地方添加一个检查以查看“xyz.exe”进程是否仍在运行。您可以使用前面保存的句柄使用
GetExitCodeProcess
函数,并检查返回值是否仍处于活动状态。如果“xyz.exe”进程不再处于活动状态,则可以再次使用
EnableWindow
启用“abc.exe”窗口

−1检查循环中的
仍处于活动状态
退出代码是非常危险的建议:当程序返回该值时,它会导致无限循环,而该值正好是259。这是一个指示,但不是一个确定的火灾信号。相反,对于消息循环,您可以调用
WaitForSingleObject
并传递0(零)作为超时参数(不要仅在
WM_PAINT
!)上执行此操作)。更好的选择是在等待外部进程退出期间,将消息循环更改为使用
MsgWaitForMultipleObjects()
。但如果这不是一个选项,那么通过
SetTimer()
使用
WM\u TIMER
比使用
WM\u PAINT
定期调用
WaitForSingleObject()
更合适。