1、用QProcess調用沒有窗口顯示
但是任務管理欄裏有進程在
2、通過system調用
QString qstrRExePath("C:/run/test.exe");
QString qstrWorkPath("C:/run");
QString str = "cd " + qstrWorkPath + " & " + qstrRExePath;
system(str.toStdString().c_str());
能彈出窗口,但是控制檯進程依賴與gui進程存在而存在,做不到啓動控制檯進程後,主程序把自己強殺掉
3、通過WIN32API函數CreateProcess用來創建一個新的進程
注意參數
(1)si.wShowWindow = SW_SHOWNORMAL;
(2)CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP
(3)// 無限期等待線程執行完畢
// 主線程被掛起
//WaitForSingleObject(pi.hProcess, INFINITE);
static DWORD CreateIndependentProcessShowWindows(char const *strProcess)
{
//LOG_SETUP_DEBUG("[cmd]: %s", strCmd);
std::string strCmdCopy(strProcess);
std::wstring wstrCmdCopy = CCodeConvert::ACP_to_WUNICODE(strCmdCopy.c_str());
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOWNORMAL;
int iRet = 0;
BOOL bRet = CreateProcess(
NULL,
(LPWSTR)wstrCmdCopy.c_str(),
NULL,
NULL,
FALSE,
CREATE_NEW_CONSOLE | CREATE_NEW_PROCESS_GROUP,
NULL,
NULL,
&si,
&pi
);
if (bRet == FALSE)
{
DWORD iErr = GetLastError();
return 0xFF + iErr;
}
CloseHandle(pi.hThread);
// 無限期等待線程執行完畢
// 主線程被掛起
//WaitForSingleObject(pi.hProcess, INFINITE);
DWORD dwExitCode;
GetExitCodeProcess(pi.hProcess, &dwExitCode);
CloseHandle(pi.hProcess);
return dwExitCode;
};
};
話題: