【问题标题】:CreateProcess can start a process, but QProcess cannot... why?CreateProcess 可以启动一个进程,但是 QProcess 不能……为什么?
【发布时间】:2013-01-16 05:57:37
【问题描述】:

我正在编写一个需要启动其他应用程序的 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 错误而失败。

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

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

【问题讨论】:

  • 不要将QString.utf16() 的结果类型转换为TCHAR*。如果代码以 ANSI 配置编译,TCHAR 将映射到 char 而不是 wchar_tCreateProcess() 将映射到 CreateProcessA(),因此您将向其传递错误数据。删除类型转换并直接调用CreateProcessW()

标签: c++ windows qt winapi qt4


【解决方案1】:

您的路径中有空格。您正在调用采用单个参数的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());

【讨论】:

  • 我强烈推荐第二个版本。更少麻烦,更不容易出错,适用于所有平台。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 2015-01-03
  • 2012-10-20
相关资源
最近更新 更多