Npackdで次のスクリプトを使用してDropbox をアンインストールします。XP と Vista では動作しますが、Windows 7/64 では失敗します。タスクバー (通常は画面の下部にあるもの) を表示する代わりに、C:/ のコンテンツを含む Windows エクスプローラー ウィンドウを表示します。DLL ベースのシェル拡張を持つ他のパッケージを削除しても同じ効果が見られるため、これは Dropbox に関連したものではありません。
Uninstall.exe /S _?=%CD%
taskkill /f /fi "IMAGENAME eq explorer.exe"
del DropboxExt.13.dll
del DropboxExt64.13.dll
rem start explorer from the root directory so it does not lock this one
start "" /D\ explorer.exe
スクリプトの何が問題になっていますか? Windows 7 でも正しく動作するように変更するにはどうすればよいですか?
ありがとう
編集:私はこの問題に本当にうんざりしています。次のバッチ ファイルは、通常のユーザーとして開始するか、「管理者として」開始するかのいずれかで機能します。
taskkill /f /fi "IMAGENAME eq explorer.exe"
ping -n 5 127.0.0.1
pushd \
rem runas /trustlevel:0x20000
start "" /D\ explorer.exe
popd
私のプログラムから .bat を開始するコードは次のとおりです (path="Uninstall.bat"、2 つの新しい環境変数のみが定義されています)。
QDir d = this->getDirectory();
QProcess p(0);
p.setProcessChannelMode(QProcess::MergedChannels);
QStringList params;
p.setWorkingDirectory(d.absolutePath());
QString exe = d.absolutePath() + "\\" + path;
for (int i = 0; i < env.count(); i += 2) {
p.processEnvironment().insert(env.at(i), env.at(i + 1));
}
p.start(exe, params);
Qt/qprocess_win.cpp の対応するコード:
DWORD dwCreationFlags = CREATE_NO_WINDOW;
dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT;
STARTUPINFOW startupInfo = { sizeof( STARTUPINFO ), 0, 0, 0,
(ulong)CW_USEDEFAULT, (ulong)CW_USEDEFAULT,
(ulong)CW_USEDEFAULT, (ulong)CW_USEDEFAULT,
0, 0, 0,
STARTF_USESTDHANDLES,
0, 0, 0,
stdinChannel.pipe[0], stdoutChannel.pipe[1], stderrChannel.pipe[1]
};
success = CreateProcess(0, (wchar_t*)args.utf16(),
0, 0, TRUE, dwCreationFlags,
environment.isEmpty() ? 0 : envlist.data(),
workingDirectory.isEmpty() ? 0 : (wchar_t*)QDir::toNativeSeparators(workingDirectory).utf16(),
&startupInfo, pid);
Explorer がタスクバーが既にあると考えるのはなぜですか?
EDIT2:今何が悪いのか知っています。エクスプローラーが強制終了された後、svchost.exe プロセスによって次のパラメーターを使用して新しいプロセスが自動的に開始されます: /factory,{682159d9-c321-47ca-b3f1-30e36b2ec8b9}。GUID は DesktopExplorerFactory 用です。これはおそらく、COM サービスのクラッシュ保護です。explorer.exe を呼び出しても、新しい Explorer が既に存在するため、起動しません。ウィンドウが開かれていない場合、1 ~ 2 分後にこのプロセスは自動的に閉じられます。したがって、Ben Voigt は正しく、「すべてのユーザーをログオフせずにシェルを完全にアンロードする良い方法は実際にはありません」と思います。