CreateProcess可以启动一个进程,但QProcess不能…为什么?

我正在写一个Windows QT应用程序,需要启动其他应用程序。 如果我使用下面的窗口调用一切工作正常:

QString qsExePath = "C:\\Program Files (x86)\\Some Company\\SomeApp.exe"; QString qsCommandLine = ""; DWORD dwLastError = 0; STARTUPINFO startupInfo; ZeroMemory(&startupInfo, sizeof(startupInfo)); startupInfo.cb = sizeof(startupInfo); startupInfo.dwFlags = STARTF_USESHOWWINDOW; startupInfo.wShowWindow = (WORD)1; PROCESS_INFORMATION processInfo; ZeroMemory(&processInfo, sizeof(processInfo)); if (CreateProcess((TCHAR*)(qsExePath.utf16()), (TCHAR*)(qsCommandLine.utf16()), NULL, NULL, FALSE, 0, NULL, NULL, &startupInfo, &processInfo)) { CloseHandle(processInfo.hProcess); CloseHandle(processInfo.hThread); } else { dwLastError = GetLastError(); } 

但是,如果我使用以下QT调用它不起作用,并与QProcess ::未知错误失败。

 QProcess process; bool bStarted = process.startDetached(qsExePath); qDebug() << process.error(); 

如果将SomeApp.exe复制到我的%TMP%目录并相应地更改qsExePath,那么我可以使QProcess工作,所以显然是某种权限错误。 我不明白为什么,但如果它真的权限,不应该我的CreateProcess窗口调用失败?

Solutions Collecting From Web of "CreateProcess可以启动一个进程,但QProcess不能…为什么?"

你的路径中有空格。 您正在调用带有单个参数的QProcess.startDetached()的重载版本,因此将其解释为要执行的完整命令行。 因此,尝试用引号包装路径,否则会认为“C:\ Program”是要执行的程序,其他的都是参数,这是错误的:

 QString qsExePath = "\"C:\\Program Files (x86)\\Some Company\\SomeApp.exe\""; bool bStarted = process.startDetached(qsExePath); 

或者,调用startDetached()的其他重载版本之一,让它在内部为你计算出必要的引用:

 QString qsExePath = "C:\\Program Files (x86)\\Some Company\\SomeApp.exe"; bool bStarted = process.startDetached(qsExePath, QStringList());