3

他のアプリを起動する必要がある 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ウィンドウの呼び出しは失敗するべきではありませんか?

4

1 に答える 1

5

パスにスペースが含まれています。QProcess.startDetached()単一のパラメーターを取るオーバーロードされたバージョンを呼び出しているため、実行する完全なコマンドラインとして解釈されます。そのため、パスを引用符で囲んでみてください。そうしないと、「C:\Program」が実行するプログラムであり、それ以外はすべて引数であると見なされてしまい、これは間違っています。

QString qsExePath = "\"C:\\Program Files (x86)\\Some Company\\SomeApp.exe\"";
bool bStarted = process.startDetached(qsExePath);

または、他のオーバーロードされたバージョンの の 1 つを呼び出しstartDetached()て、内部で必要な引用を実行させます。

QString qsExePath = "C:\\Program Files (x86)\\Some Company\\SomeApp.exe";
bool bStarted = process.startDetached(qsExePath, QStringList());
于 2013-02-01T00:22:26.167 に答える