Я использую следующий скрипт в Npackd для удаления Dropbox.Он работает в XP и Vista, но не работает в Windows 7/64.Вместо того, чтобы показывать панель задач (та, которая обычно находится внизу экрана), она показывает окно проводника Windows с содержимым C: /.Это не связано с Dropbox, поскольку удаление других пакетов с расширениями оболочки на основе DLL также показывает тот же эффект.
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 из моей программы (путь = "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);
Почему Проводник считает, что панель задач уже есть?
EDIT2: я знаю, что сейчас не так.После уничтожения проводника новый процесс автоматически запускается процессом svchost.exe со следующими параметрами: / factory, {682159d9-c321-47ca-b3f1-30e36b2ec8b9}.GUID предназначен для DesktopExplorerFactory.Вероятно, это защита от сбоев для службы COM.Мои вызовы explorer.exe не запускают новый проводник, поскольку он уже есть.Через минуту или две этот процесс будет автоматически закрыт, если окна не открыты.Поэтому я считаю, что Бен Фойгт прав, и «на самом деле нет хорошего способа полностью разгрузить оболочку без выхода из системы всех пользователей».