我使用Npackd下面的腳本來卸載Dropbox。它適用於XP和Vista,但在Windows 7/64上失敗。它不顯示任務欄(通常位於屏幕底部的任務欄),而是顯示內容爲C:/的Windows資源管理器窗口。這不是Dropbox相關的,因爲使用基於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
下面是從我的節目(PATH =「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);
爲什麼瀏覽器認爲已經有一個任務欄?
編輯2:我知道現在出了什麼問題。在資源管理器被殺死後,一個新的自動啓動由svchost.exe進程使用以下參數:/ factory,{682159d9-c321-47ca-b3f1-30e36b2ec8b9}。 GUID適用於DesktopExplorerFactory。這可能是COM服務的防撞保護。我的電話explorer.exe不會啓動一個新的資源管理器,因爲已經有一個。一兩分鐘後,如果沒有窗戶打開,此過程將自動關閉。所以我認爲Ben Voigt是對的,「沒有完全卸載shell而沒有註銷所有用戶的真正方法。」
pushd/popd不會幫助不幸 – kaboom 2010-12-20 17:04:38
我也已經知道如何控制Windows資源管理器的工作目錄:請參閱我的問題中的「/ D \」。我的問題只是關於Windows 7. – kaboom 2010-12-20 17:14:24
@kaboom:請參閱編輯 – 2010-12-20 22:59:55