問題
バッチ ファイルの一部 (追加情報を参照) では、エクスプローラーを再起動する必要があるため、試行錯誤された方法を使用します。
taskkill /f /im explorer.exe >nul
explorer.exe
するとこうなる
explorer.exe
正常に終了しましたexplorer.exe
は開始されますが (画像 2 を参照)、エクスプローラー ウィンドウしか開きません。
Win + R
その後、エクスプローラーの一部であると想定しているため、タスクマネージャーから新しいタスクを開始することによってのみ、エクスプローラーを適切に再起動できます。
追加情報
ここで、WinRAR で作成された自己実行型 SFX アーカイブからバッチ ファイルを実行しているので、「ちょっと」と言います。したがって、実行すると、アーカイブの内容が抽出され%temp%
、抽出が成功すると、ユーザー定義ファイル (通常はブートストラップ、この場合はバッチ ファイル) が実行されます。
これまでのところ、私は推測しました
explorer.exe
間違いなく完全に殺されています。- バッチ ファイルは間違いなく正しく呼び出され、正しく実行されます。開始する行を除いて、スクリプト内の他のすべてが設計どおりに動作します。
explorer.exe
- エクスプローラーを再起動するコマンドは、遅延を試みたので、「タイミングが悪い」などではありません。
- バッチ ファイルは、アーカイブから手動で抽出すると完全に機能するため、圧縮または抽出プロセスの問題ではありません。
- Explorerなどのコマンドでも
start explorer.exe | cmd.exe
正常に再起動しないため、.bat
ファイルの問題ではありません。
Windows XP と Windows 7 x86 では動作することを確認できますが、Windows 7 x64 (私のシステム) では動作しません。
状態
現時点では、コード自体が機能することが証明されているため、WinRAR には懐疑的です。そのため、さまざまなバージョンの WinRAR を使用して自己実行 SFX を作成しています。これまでのところ、私はバージョンを試しました:
- 4.11 x86
- 4.11×64
- 4.20b3 x86
- 4.20b3 x64
毎回同じ結果でした。
昨日dev@rarlab.comにバグレポートを提出し、今朝Eugene Roshal自身から返信を受け取りました
こんにちは、SFX モジュールは ShellExecuteEx を使用してセットアップ アプリケーションを起動します。通常はうまく機能します。Explorer がウィンドウ モードに切り替える理由がわかりません。今、私は小さなスタンドアロンプログラムを構築しました
#include <windows.h>
void main()
{
SHELLEXECUTEINFO si;
memset(&si,0,sizeof(si));
si.cbSize=sizeof(si);
si.lpFile="test.bat";
si.nShow=SW_SHOWNORMAL;
ShellExecuteEx(&si);
}
サンプルのような内容で test.bat を実行します。このプログラムは、WinRAR SFX とまったく同じ動作を示すため、エクスプローラーをウィンドウで起動します。
そして今朝二通目のメール
申し訳ありませんが、今はアドバイスではありません。ShellExecuteEx を CreateProcess に置き換えました
#include <windows.h>
void main()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
CreateProcess(NULL,"test.bat",NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);
}
しかし、結果は同じです。SW_SHOWDEFAULT や SW_RESTORE などの他の SW_ フラグを ShellExecuteEx と共に "open" および "explore" lpVerb として使用しようとしましたが、役に立ちません。今のところ、このウィンドウ モードとデスクトップ モードの背後にあるロジックがわかりません。
見通しが厳しいことは承知していますが、それが誰かの助けになることを願っています..
証明/証拠
これを示す SFX アーカイブへのリンク (必要な場合): https://dl.dropbox.com/u/27573003/Social%20Distribution/restart-explorer.exe
ここで、VM 内でコマンドを実行していることに気付くかもしれませんが ( で示されています
VMwareTray.exe
)、これは VM が原因の競合ではありません。自分のホスト システム (同じ OS) でまったく同じファイルをテストしたところ、同じ結果が得られました。
アップデート
REG ADD
まったく別のプロジェクトで使用すると、同様の「SFX アーカイブの外にあるが、1 つのアーカイブからではない作品」の問題が発生します。SFX アーカイブがバッチ ファイルでうまく機能するとは思えません。