請問,在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("執行完畢");
}
