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

and*_*ier 3 c++ windows winapi qt qt4

我正在编写一个需要启动其他应用程序的Windows QT应用程序.如果我使用以下Windows调用一切正常:

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();
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用以下QT调用它不起作用并且因QProcess :: Unknown Error而失败.

QProcess process;
bool bStarted = process.startDetached(qsExePath);
qDebug()  << process.error();   
Run Code Online (Sandbox Code Playgroud)

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

Rem*_*eau 5

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

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

或者,调用其他一个重载版本,startDetached()并让它在内部为您完成必要的引用:

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

  • 我强烈推荐第二个版本.减少麻烦,减少错误,适用于所有平台. (3认同)