2016-09-27 6 views
2

私はボタン付きの小さなQt GUIプログラムを持っています。これは.batファイルを開始します。Qt5:QProcess :: startDetachedで.batファイルを呼び出すと、System32でプログラムが見つかりません

の.batを呼び出すための重要な部分はこれです:

void MainWindow::on_pushButton_clicked() 
{ 
    int r = QMessageBox::warning(this, tr("Shutdown System"), 
    tr("Do you want to close the program and the system?"), 
    QMessageBox::Yes | QMessageBox::Default, 
    QMessageBox::No, 
    QMessageBox::Cancel | QMessageBox::Escape); 

    if (r == QMessageBox::Yes){ 
     QProcess::startDetached("cmd /C shutdown_all.bat"); 
    } 
} 

私はC:\Windows\System32\psshutdown.exeに位置PSShutdownを呼び出すするつもり、と当然のPATHに。

私はテスト目的のための.batでこれを置く:

cd C:\Windows\System32 
psshutdown 
PAUSE 

を.BATファイルが単独で呼び出されると、それについてのプログラムおよび印刷情報を見つけるように見えるが、私は呼び出すために、ボタンを使用する場合Qtのプログラムでの.bat呼び出す

.bat called from Qt program

プログラムは、それが結果の psshutdown.exe

キャプチャを見つけることができませんダブルクリック(期待される結果)との.batを呼び出す

は: enter image description here

パスも.BATにecho %PATH%を追加する場合、両方のバージョンで[OK]を印刷しているようです。どんなアイデアが間違っているのでしょうか?

これは、二つの異なるコンピュータでは、Qtの5.5および5.7、デバッグとリリースモードでテストされています。

私は必要に応じて完全なソースコードを提供することができますが、Qt Creatorのテンプレートを使用してボタンを追加したQtウィジェットアプリケーションに過ぎません。

+0

に、Windowsエクスプローラのような64ビットのファイルマネージャでファイルpsshutdown.exeをコピーしています。 ** C:\ windows \ system32 \ psshutdown.exe ** – Squashman

+0

こんにちは@Squashman、まだ見つかりません。回避策私は同じフォルダに実行ファイルをコピーしてpsshutdownの呼び出しを呼び出すのがわかりましたが、それはすばやく汚れた解決策です。 –

+1

64ビットシステムで32ビットの実行可能ファイルを実行している場合、[ファイルシステムリダイレクタ](https://msdn.microsoft.com/en-us/library/aa384187.aspx)が犠牲になっている可能性があります。 'psshutdown.exe'を' C:\ WINDOWS \ SysWOW64'にコピーしてみてください。コピーした後にエラーが発生しなければ、そうです。 。 。 – Mike

答えて

2

psshutdown.exeは、通常のWindowsには存在しない実行可能です。これはWindows Sysinternalsのツールで、ダウンロードして手動で任意のディレクトリにコピーする必要があります。

64ビット版のWindows 64ビットアプリケーションでは、%SystemRoot%\System32の64ビットアプリケーションと動的リンクライブラリにアクセスします。

が、Windows File System Redirectorは、実行可能ファイルを実行またはDLLをロードするため%SystemRoot%\System32にアクセスする上で、32ビットのシステム・ディレクトリ%SystemRoot%\SysWOW64に64ビットWindows上で実行されているx86アプリケーションをリダイレクトします。

一つの解決策は、バッチファイルに次のコードを使用している:

if exist %SystemRoot%\System32\psshutdown.exe (
    %SystemRoot%\System32\psshutdown.exe 
) else if exist %SystemRoot%\Sysnative\psshutdown.exe (
    %SystemRoot%\Sysnative\psshutdown.exe 
) else if %SystemRoot%\SysWOW64\psshutdown.exe (
    %SystemRoot%\SysWOW64\psshutdown.exe 
) else (
    echo Error: Can't find psshutdown.exe in system directory of Windows. 
    pause 
) 

このバッチコードは、32ビットおよび64ビットWindows用のx64またはx86アプリケーションとしてQtアプリケーションのコンパイルに独立したシステムに依存しない動作しますディレクトリpsshutdown.exeが前にコピーされました。

IF条件は、64ビットSystem32および32ビットSysWOW64 64ビットWindows上でのみSystem32および64ビットのアプリケーションと32ビットWindowsで32ビットアプリケーションのためのものです。

第2のIFの条件は、64ビットWindowsの32ビットアプリケーションで、64ビットのSystem32にアクセスするための条件です。

第3のIFは、32ビットSysWOW64にアクセスするための64ビットWindows上の64ビットアプリケーション用です。

別の解決策は、あなたがバッチファイルで実行可能ファイルへのフルパスを指定するときに何が起こるか知りたい二つのディレクトリ

%SystemRoot%\System32 
%SystemRoot%\SysWOW64 
関連する問題