BOOL CCommonAppUtils::StartTextViewer(CString file) { CString viewer = GetAppForFile (file, L".txt", L"open", false); if (viewer.IsEmpty()) { OPENASINFO oi = { 0 }; oi.pcszFile = file; oi.oaifInFlags = OAIF_EXEC; return SHOpenWithDialog(NULL, &oi) == S_OK ? TRUE : FALSE; } return LaunchApplication (viewer, IDS_ERR_TEXTVIEWSTART, false) ? TRUE : FALSE; }
static Boolean launchApp (FSSpec *fs) { LaunchParamBlockRec pb; clearbytes (&pb, (long) sizeof (pb)); pb.launchAppSpec = fs; pb.launchBlockID = extendedBlock; pb.launchEPBLength = extendedBlockLen; pb.launchControlFlags = launchContinue | launchNoFileFlags/* | launchDontSwitch*/; return (LaunchApplication (&pb) == noErr); } /*launchApp*/
bool CCommonAppUtils::RunTortoiseProc(const CString& sCommandLine) { CString pathToExecutable = CPathUtils::GetAppDirectory()+L"TortoiseProc.exe"; CString sCmd; sCmd.Format(L"\"%s\" %s", (LPCTSTR)pathToExecutable, (LPCTSTR)sCommandLine); if (AfxGetMainWnd()->GetSafeHwnd() && (sCommandLine.Find(L"/hwnd:")<0)) { CString sCmdLine; sCmdLine.Format(L"%s /hwnd:%p", (LPCTSTR)sCommandLine, (void*)AfxGetMainWnd()->GetSafeHwnd()); sCmd.Format(L"\"%s\" %s", (LPCTSTR)pathToExecutable, (LPCTSTR)sCmdLine); } if (!g_sGroupingUUID.IsEmpty()) { sCmd += L" /groupuuid:\""; sCmd += g_sGroupingUUID; sCmd += L"\""; } return LaunchApplication(sCmd, NULL, false); }
BOOL CCommonAppUtils::StartUnifiedDiffViewer(const CString& patchfile, const CString& title, BOOL bWait) { CString viewer; CRegString v = CRegString(L"Software\\TortoiseSVN\\DiffViewer"); viewer = v; if (viewer.IsEmpty() || (viewer.Left(1).Compare(L"#")==0)) { // use TortoiseUDiff viewer = CPathUtils::GetAppDirectory(); viewer += L"TortoiseUDiff.exe"; // enquote the path to TortoiseUDiff viewer = L"\"" + viewer + L"\""; // add the params viewer = viewer + L" /patchfile:%1 /title:\"%title\""; if (!g_sGroupingUUID.IsEmpty()) { viewer += L" /groupuuid:\""; viewer += g_sGroupingUUID; viewer += L"\""; } } if (viewer.Find(L"%1")>=0) { if (viewer.Find(L"\"%1\"") >= 0) viewer.Replace(L"%1", patchfile); else viewer.Replace(L"%1", L"\"" + patchfile + L"\""); } else viewer += L" \"" + patchfile + L"\""; if (viewer.Find(L"%title") >= 0) { viewer.Replace(L"%title", title); } if(!LaunchApplication(viewer, IDS_ERR_DIFFVIEWSTART, !!bWait)) { return FALSE; } return TRUE; }
// XXXldb |args| has the wrong const-ness NS_IMETHODIMP nsProcess::Run(PRBool blocking, const char **args, PRUint32 count, PRUint32 *pid) { NS_ENSURE_TRUE(mExecutable, NS_ERROR_NOT_INITIALIZED); PRStatus status = PR_SUCCESS; // make sure that when we allocate we have 1 greater than the // count since we need to null terminate the list for the argv to // pass into PR_CreateProcess char **my_argv = NULL; my_argv = (char **)nsMemory::Alloc(sizeof(char *) * (count + 2) ); if (!my_argv) { return NS_ERROR_OUT_OF_MEMORY; } // copy the args PRUint32 i; for (i=0; i < count; i++) { my_argv[i+1] = NS_CONST_CAST(char*, args[i]); } // we need to set argv[0] to the program name. my_argv[0] = mTargetPath.BeginWriting(); // null terminate the array my_argv[count+1] = NULL; #if defined(XP_WIN) STARTUPINFO startupInfo; PROCESS_INFORMATION procInfo; BOOL retVal; char *cmdLine; if (assembleCmdLine(my_argv, &cmdLine) == -1) { nsMemory::Free(my_argv); return NS_ERROR_FILE_EXECUTION_FAILED; } ZeroMemory(&startupInfo, sizeof(startupInfo)); startupInfo.cb = sizeof(startupInfo); retVal = CreateProcess(NULL, // NS_CONST_CAST(char*, mTargetPath.get()), cmdLine, NULL, /* security attributes for the new * process */ NULL, /* security attributes for the primary * thread in the new process */ FALSE, /* inherit handles */ 0, /* creation flags */ NULL, /* env */ NULL, /* current drive and directory */ &startupInfo, &procInfo ); PR_Free( cmdLine ); if (blocking) { // if success, wait for process termination. the early returns and such // are a bit ugly but preserving the logic of the nspr code I copied to // minimize our risk abit. if ( retVal == TRUE ) { DWORD dwRetVal; unsigned long exitCode; dwRetVal = WaitForSingleObject(procInfo.hProcess, INFINITE); if (dwRetVal == WAIT_FAILED) { nsMemory::Free(my_argv); return NS_ERROR_FAILURE; } if (GetExitCodeProcess(procInfo.hProcess, &exitCode) == FALSE) { mExitValue = exitCode; nsMemory::Free(my_argv); return NS_ERROR_FAILURE; } mExitValue = exitCode; CloseHandle(procInfo.hProcess); } else status = PR_FAILURE; } else { // map return value into success code if (retVal == TRUE) status = PR_SUCCESS; else status = PR_FAILURE; } #else // Note, this must not be an #elif ...! #if defined(XP_MACOSX) if (count == 0) { FSSpec resolvedSpec; OSErr err = noErr; nsCOMPtr<nsILocalFileMac> macExecutable = do_QueryInterface(mExecutable); macExecutable->GetFSSpec(&resolvedSpec); LaunchParamBlockRec launchPB; launchPB.launchAppSpec = &resolvedSpec; launchPB.launchAppParameters = NULL; launchPB.launchBlockID = extendedBlock; launchPB.launchEPBLength = extendedBlockLen; launchPB.launchFileFlags = NULL; launchPB.launchControlFlags = launchContinue + launchNoFileFlags + launchUseMinimum; if (!blocking) launchPB.launchControlFlags += launchDontSwitch; err = LaunchApplication(&launchPB); // NOTE: blocking mode assumes you are running on a thread // other than the UI thread that has the main event loop if (blocking && err == noErr) { while (1) { ProcessInfoRec info; info.processInfoLength = sizeof(ProcessInfoRec); info.processName = NULL; info.processAppSpec = NULL; err = GetProcessInformation(&launchPB.launchProcessSN, &info); if (err != noErr) { // The process is no longer in the process // manager's internal list, assume the process is // done. err = noErr; break; } // still running so sleep some more (200 msecs) PR_Sleep(200); } } if (err != noErr) { status = PR_FAILURE; } if (blocking) { mExitValue = err; } } else #endif { if (blocking) { mProcess = PR_CreateProcess(mTargetPath.get(), my_argv, NULL, NULL); if (mProcess) status = PR_WaitProcess(mProcess, &mExitValue); } else { status = PR_CreateProcessDetached(mTargetPath.get(), my_argv, NULL, NULL); } } #endif // free up our argv nsMemory::Free(my_argv); if (status != PR_SUCCESS) return NS_ERROR_FILE_EXECUTION_FAILED; return NS_OK; }
static OSStatus LaunchSystemEvents(ProcessSerialNumber *psnPtr) // Launches the "System Events" process. { OSStatus err; FSRef appRef; assert(psnPtr != NULL); // Ask Launch Services to find System Events by creator. err = LSFindApplicationForInfo( kSystemEventsCreator, NULL, NULL, &appRef, NULL ); // Launch it! if (err == noErr) { if ( LSOpenApplication != NULL ) { LSApplicationParameters appParams; // Do it the easy way on 10.4 and later. memset(&appParams, 0, sizeof(appParams)); appParams.version = 0; appParams.flags = kLSLaunchDefaults; appParams.application = &appRef; err = LSOpenApplication(&appParams, psnPtr); } else { FSSpec appSpec; LaunchParamBlockRec lpb; // Do it the compatible way on earlier systems. // I launch System Events using LaunchApplication, rather than // Launch Services, because LaunchApplication gives me back // the ProcessSerialNumber. Unfortunately this requires me to // get an FSSpec for the application because there's no // FSRef version of Launch Application. if (err == noErr) { err = FSGetCatalogInfo(&appRef, kFSCatInfoNone, NULL, NULL, &appSpec, NULL); } if (err == noErr) { memset(&lpb, 0, sizeof(lpb)); lpb.launchBlockID = extendedBlock; lpb.launchEPBLength = extendedBlockLen; lpb.launchControlFlags = launchContinue | launchNoFileFlags; lpb.launchAppSpec = &appSpec; err = LaunchApplication(&lpb); } if (err == noErr) { *psnPtr = lpb.launchProcessSN; } } } return err; }