2013-02-01 79 views
1

我正在編寫一個需要啓動其他應用程序的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窗口調用不應該失敗嗎?

+0

不要類型轉換QString.utf16的'結果()'的'TCHAR *'。如果代碼是用ANSI配置編譯的,'TCHAR'將映射到'char'而不是'wchar_t',而'CreateProcess()'將映射到'CreateProcessA()',因此你將傳遞壞數據給它。取而代之,直接調用'CreateProcessW()'。 –

回答

4

您的路徑中有空格。您正在調用帶有單個參數的QProcess.startDetached()的重載版本,因此它將其解釋爲要執行的完整命令行。因此,嘗試包裝在引號的路徑,否則會認爲「C:\程序」是執行程序和其他一切有觀點,這將是錯誤的:

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()); 
+2

我強烈推薦第二個版本。較少麻煩,較少出錯,適用於所有平臺。 –

相關問題