私はNpackdで次のスクリプトを使用してDropboxをアンインストールします。 XPとVistaでは動作しますが、Windows 7/64では動作しません。タスクバー(通常画面の一番下にあるもの)を表示するのではなく、C:/という内容のWindows Explorerウィンドウを表示します。 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
は私のプログラム(パス=「uninstall.batを」、唯一の2つの新しい環境変数からの.batを開始したコードです)に定義されています。
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:今何が間違っているのか分かります。 Explorerが終了すると、svchost.exeプロセスによって、/ factory、{682159d9-c321-47ca-b3f1-30e36b2ec8b9}のパラメータを持つ新しいファイルが自動的に開始されます。 GUIDはDesktopExplorerFactory用です。これは、おそらくCOMサービスのクラッシュ防御です。 explorer.exeへの私の呼び出しは、新しいエクスプローラが既に存在するので、新しいエクスプローラを起動しません。 1〜2分後に、このウィンドウが開かれていなければ、このプロセスは自動的に閉じられます。だから私はBen Voigtが正しいと思う。「すべてのユーザーからログオフせずにシェルを完全にアンロードする方法は本当にない。
pushd/popd do not help残念ながら – kaboom
私はすでにWindowsエクスプローラの作業ディレクトリを制御する方法を知っています。私の質問では "/ D \"を参照してください。私の質問はWindows 7だけです。 – kaboom
@kaboom:編集 –