我正在编写一个需要启动其他应用的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 :: Unknown Error而失败。
QProcess process;
bool bStarted = process.startDetached(qsExePath);
qDebug() << process.error();
如果将SomeApp.exe复制到我的%TMP%目录并且相应地更改qsExePath,我可以让QProcess工作,所以显然是某种权限错误。我不明白为什么......如果真的是权限,我的CreateProcess窗口调用不应该失败吗?
答案 0 :(得分:5)
你的路径中有空格。您正在调用带有单个参数的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());