怎样在程序中执行另一个可执行文件? ShellExecuteEx 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个函数能在调用另一个可执行文件的时候,等待它返回吗?并把返回值返回给这个函数吗?也就是“阻塞式执行“吗?我看了书,书上好象说,这个函数以及上面那位网友说的ShellExecuteEx,都是调用了以后,生成一个新进程,并不等待该进程执行完毕返回其返回值。我需要的是等待这个可执行文件执行完毕并返回值。这两个函数哪个行? 所谓“在A中执行B”是不可能的,只能是“在A中调用B”。首先,程序的执行是由系统解释的,若你要在A中调用B,则你必须完成对B的运行解释,再交由系统执行。在A中调用B会使B生成一个新进程,要阻塞A进程只能靠你的A程序中自行阻塞,但保留与进程B的通信,在收到B结束的消息后再自行解锁。 CreateProcess 肯定可以。 UINT ProcessStatus(LPVOID pParam){ PROCESS_INFORMATION pi; STARTUPINFO si; si.cb=sizeof(si); si.wShowWindow=SW_SHOW; si.dwFlags=STARTF_USESHOWWINDOW; BOOL fRet=CreateProcess(NULL, "d:\\temp\\disk1\\setup.exe -r", NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); if(fRet) { m_hPro=pi.hProcess;//保存当前进程句柄,在强制结束进程时使用。 } if(::WaitForSingleObject(m_hPro,INFINITE)==WAIT_OBJECT_0) { AfxMessageBox("the Process is go over"); } CloseHandle(m_hPro); return 0;} 非常感谢!你这一段代码好象能让A进程等待调用的那个可执行文件(B进程)结束,再继续执行A进程下面的语句,那能不能获取B进程的返回值呢?这个很重要。我需要知道B进程执行结果。(另:这两个进程都是我编的,可以在B进程里添加语句,为什么要通过A进程调用B进程这种复杂的方式而不是直接放到一个进程里?是因为我的是一个输入法的安装程序,要想32位系统和64位系统都适应,必须安装程序是32位的,如果是64位的在32位系统下根本无法运行,而输入法的注册又必须用64位程序来完成,否则只有一个能用另一个不能用。这就导致了必须用32位的安装程序,调用64位的程序去注册的问题) 非常感谢!你这一段代码好象能让A进程等待调用的那个可执行文件(B进程)结束,再继续执行A进程下面的语句,那能不能获取B进程的返回值呢?这个很重要。我需要知道B进程执行结果。(另:这两个进程都是我编的,可以在B进程里添加语句,为什么要通过A进程调用B进程这种复杂的方式而不是直接放到一个进程里?是因为我的是一个输入法的安装程序,要想32位系统和64位系统都适应,必须安装程序是32位的,如果是64位的在32位系统下根本无法运行,而输入法的注册又必须用64位程序来完成,否则只有一个能用另一个不能用。这就导致了必须用32位的安装程序,调用64位的程序去注册的问题)GetExitCodeProcess(m_hPro, &dwExitCode);就行。 应该用CreateProcess()靠谱,ShellExecuteEx只是执行外壳程序。 升级散分 100分,解答3个网络问题? 在mfc中如何取得当前程序的hwnd呢? 结构体中指针变量动态分配空间(用于串口组帧) 语音聊天的连接方式? 想做一个类字符终端程序,不知道哪里有开发terminal的类库 怎样在程序中检测ActiveX控件(已知GUID)是否已经注册? 如何判断一个路径指的是目录还是文件? VC6.0是否可以写Webservice服务端程序 C++炫彩界面库自定义消息 vc画圆,增加线条宽度时,怎样不让线条中出现白点,求大神解答 MFC程序异常退出检测
在A中调用B会使B生成一个新进程,要阻塞A进程只能靠你的A程序中自行阻塞,但保留与进程B的通信,在收到B结束的消息后再自行解锁。
UINT ProcessStatus(LPVOID pParam)
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
si.cb=sizeof(si);
si.wShowWindow=SW_SHOW;
si.dwFlags=STARTF_USESHOWWINDOW;
BOOL fRet=CreateProcess(NULL,
"d:\\temp\\disk1\\setup.exe -r",
NULL,
NULL,
FALSE,
NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi);
if(fRet)
{
m_hPro=pi.hProcess;//保存当前进程句柄,在强制结束进程时使用。
}
if(::WaitForSingleObject(m_hPro,INFINITE)==WAIT_OBJECT_0)
{
AfxMessageBox("the Process is go over");
}
CloseHandle(m_hPro);
return 0;
}
GetExitCodeProcess(m_hPro, &dwExitCode);
就行。