MFC调用批处理,等待执行完毕并获取其返回值
请问,在MFC调用批处理后如何能检测到其返回值,因为要根据其返回值判断批处理是否运行成功。
假设批处理出错后 exit
/b 1
正常 exit /b
0
那批处理结束以后,如何能判断其返回值是0还是1?
解决方案一
运行批处理
PROCESS_INFORMATION info;
CreateProcess("c:\\aaa.bat ,NULL,NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE
|NORMAL_PRIORITY_CLASS,NULL,NULL,NULL,&pinfo);
批处理执行完毕后,什么时候执行完要自己猜测,获得EXit Code
int code;
GetExitCodeProcess(info.hProcess, &code);
解决方案二
运行批处理
PROCESS_INFORMATION info;
CreateProcess("c:\\aaa.bat ,NULL,NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE
|NORMAL_PRIORITY_CLASS,NULL,NULL,NULL,&pinfo);
批处理执行期间,不断的FindWindow,就是这个aaa.bat的窗口,如果存在则跳过,500毫秒后再检查,直到没找到,说明已完成并关闭了,发现aaa.bat已运行完毕后,就可以使用以下代码获得exit code了:
int code;
GetExitCodeProcess(info.hProcess, &code);
==============================================
解决方案三
你的bat运行时,根据不同的运行的结果,在退出之前,建立一个同名文件,但内容不同,如运行的某处,要exit
1时,你这样:
@echo 1> ExitCode.txt
要exit 2时,
@echo 2> ExitCode.txt
程序运行之初要
del ExitCode.txt
这样,你只要不断的检测目录下是否有ExitCode.txt文件,如果有,说明已运行完毕,内容就是所要的ExitCode了。
解决方案四
BOOL CallRegisterdllandocx(const CString& strPath )
{
CString strRegToolName(_T("\\RegisterDllAndOcx.bat"));
CString strRegToolPath = strPath;
strRegToolPath.Append(strRegToolName);
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si,sizeof(si));
si.cb = sizeof(si);
si.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
si.lpReserved = NULL;
si.lpDesktop = NULL;
si.lpTitle = NULL;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.cbReserved2 = NULL;
si.lpReserved2 = NULL;
if(!CreateProcess(NULL,strRegToolPath.LockBuffer(),NULL,NULL,FALSE,NULL,NULL,NULL,&si,&pi))
{
//AfxMessageBox(_T("不能创建进程"));
strRegToolPath.UnlockBuffer();
return FALSE;
}
else
{
WaitForSingleObject(pi.hProcess,INFINITE);
GetExitCodeProcess(pi.hProcess,&dwExitCode);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
strRegToolPath.UnlockBuffer();
return TRUE;
//AfxMessageBox("执行完毕");
}