我正在編寫一個需要啓動其他應用程序的Windows QT應用程序。如果我用下面的Windows調用一切正常:CreateProcess可以啓動一個進程,但QProcess不能...爲什麼?
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 QProcess中合作,以我的%TMP%目錄,並相應地改變qsExePath,所以這顯然是某種權限錯誤的。我不明白爲什麼......如果它真的是權限,我的CreateProcess窗口調用不應該失敗嗎?
不要類型轉換QString.utf16的'結果()'的'TCHAR *'。如果代碼是用ANSI配置編譯的,'TCHAR'將映射到'char'而不是'wchar_t',而'CreateProcess()'將映射到'CreateProcessA()',因此你將傳遞壞數據給它。取而代之,直接調用'CreateProcessW()'。 –