【发布时间】: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_t,CreateProcess()将映射到CreateProcessA(),因此您将向其传递错误数据。删除类型转换并直接调用CreateProcessW()。