bool CCommonAppUtils::LaunchApplication ( const CString& sCommandLine , UINT idErrMessageFormat , bool bWaitForStartup , bool bWaitForExit , HANDLE hWaitHandle) { PROCESS_INFORMATION process; // make sure we get a writable copy of the command line size_t bufferLen = sCommandLine.GetLength()+1; std::unique_ptr<TCHAR[]> cleanCommandLine (new TCHAR[bufferLen]); memcpy (cleanCommandLine.get(), (LPCTSTR)sCommandLine, sizeof (TCHAR) * bufferLen); if (!CCreateProcessHelper::CreateProcess(NULL, cleanCommandLine.get(), sOrigCWD, &process)) { if(idErrMessageFormat != 0) { CFormatMessageWrapper errorDetails; CString msg; msg.Format(idErrMessageFormat, (LPCTSTR)errorDetails); CString title; title.LoadString(IDS_APPNAME); MessageBox(NULL, msg, title, MB_OK | MB_ICONINFORMATION); } return false; } AllowSetForegroundWindow(process.dwProcessId); if (bWaitForStartup) WaitForInputIdle(process.hProcess, 10000); if (bWaitForExit) { DWORD count = 1; HANDLE handles[2]; handles[0] = process.hProcess; if (hWaitHandle) { count = 2; handles[1] = hWaitHandle; } WaitForMultipleObjects(count, handles, FALSE, INFINITE); if (hWaitHandle) CloseHandle(hWaitHandle); } CloseHandle(process.hThread); CloseHandle(process.hProcess); return true; }
bool CCommonAppUtils::LaunchApplication(const CString& sCommandLine, UINT idErrMessageFormat, bool bWaitForStartup, CString *cwd, bool uac) { CString theCWD = sOrigCWD; if (cwd != NULL) theCWD = *cwd; if (uac) { CString file, param; SHELLEXECUTEINFO shellinfo; memset(&shellinfo, 0, sizeof(shellinfo)); shellinfo.cbSize = sizeof(shellinfo); shellinfo.hwnd = NULL; shellinfo.lpVerb = _T("runas"); shellinfo.nShow = SW_SHOWNORMAL; shellinfo.fMask = SEE_MASK_NOCLOSEPROCESS; shellinfo.lpDirectory = theCWD; int pos = sCommandLine.Find('"'); if (pos == 0) { pos = sCommandLine.Find('"', 2); if (pos > 1) { file = sCommandLine.Mid(1, pos - 1); param = sCommandLine.Mid(pos + 1); } else { if (idErrMessageFormat != 0) { CString temp; temp.Format(idErrMessageFormat, CFormatMessageWrapper()); MessageBox(NULL, temp, _T("TortoiseGit"), MB_OK | MB_ICONINFORMATION); } return false; } } else { pos = sCommandLine.Find(' ', 1); if (pos > 0) { file = sCommandLine.Mid(0, pos); param = sCommandLine.Mid(pos + 1); } else file = sCommandLine; } shellinfo.lpFile = file; shellinfo.lpParameters = param; if (!ShellExecuteEx(&shellinfo)) { if (idErrMessageFormat != 0) { CString temp; temp.Format(idErrMessageFormat, (CString)CFormatMessageWrapper()); MessageBox(NULL, temp, _T("TortoiseGit"), MB_OK | MB_ICONINFORMATION); } return false; } if (bWaitForStartup) { WaitForInputIdle(shellinfo.hProcess, 10000); } CloseHandle(shellinfo.hProcess); } else { STARTUPINFO startup; PROCESS_INFORMATION process; memset(&startup, 0, sizeof(startup)); startup.cb = sizeof(startup); memset(&process, 0, sizeof(process)); CString cleanCommandLine(sCommandLine); if (CreateProcess(NULL, const_cast<TCHAR*>((LPCTSTR)cleanCommandLine), NULL, NULL, FALSE, 0, 0, theCWD, &startup, &process)==0) { if(idErrMessageFormat != 0) { CString temp; temp.Format(idErrMessageFormat, (CString)CFormatMessageWrapper()); MessageBox(NULL, temp, _T("TortoiseGit"), MB_OK | MB_ICONINFORMATION); } return false; } AllowSetForegroundWindow(process.dwProcessId); if (bWaitForStartup) { WaitForInputIdle(process.hProcess, 10000); } CloseHandle(process.hThread); CloseHandle(process.hProcess); } return true; }