Какой способ программно выгрузить уже дерегистрированное расширение оболочки (shell extension) наименее безболезненен для юзера и системы? Подразумевается что в Explorerе уже нет ни одного объекта, просто он по своей обычной привычке держит загруженные библиотеки "на всякий случай". Я рассмотрел такие:
1: Перегрузить машину. 100% действеннный, 100% раздражающий юзера.
2: Прибить Explorer по MSDN: PostMessage (FindWindow("Progman",NULL),WM_QUIT,0,0). Не всегда прибивается то, что надо (explorerов может быть много), да и юзер будет весьма удивлен. Кстати при таком способе Explorer не сохраняет свои настройки.
3: Как-нибудь ухитриться вызвать изнутри Explorerа функцию CoFreeUnusedLibraries. Иногда не работает (по MSDN может ждать до 10 минут), иногда почему-то выгружает чужие расширения причем используемые, как следствие развал всего десктопа.
4: Пнуть Explorer по MSDN: SHChangeNotify (SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); Выгружается резвее, но не гарантированно.
Здравствуйте, raspopov, Вы писали:
R>3: Как-нибудь ухитриться вызвать изнутри Explorerа функцию CoFreeUnusedLibraries. Иногда не работает (по MSDN может ждать до 10 минут)
Здравствуйте, Odi$$ey, Вы писали:
R>>3: Как-нибудь ухитриться вызвать изнутри Explorerа функцию CoFreeUnusedLibraries. OE>в XP появилась CoFreeUnusedLibrariesEx, которая может выгрузить немедленно
Это я и так знал, тем более, что описание этой функции лежит в MSDN рядом с первой. Тока она часто выгружает расширения которые используються, что ведет к невероятному крешу десктопа, то ли она работает излишне агрессивно, то ли эти расширения многопоточные и не держат интстанс проводника, вобщем лажа. Мне бы способ гранантированно выпнуть из проводника мое собственное расширение. Может есть какие способы насильно закрыть хэндл dll-ки в другой программе? Это нужно для инсталляции/деинсталляции расширения.
Здравствуйте, Аноним, Вы писали:
А>Как-нибудь удалось решить эту проблему?
Если исключить мной описанные способы, то нет.
Re[3]: Как удалить shell extension?
От:
Аноним
Дата:
06.04.08 19:30
Оценка:
Здравствуйте, raspopov, Вы писали:
R>Если исключить мной описанные способы, то нет.
А на каком варианте остановились?
И по поводу:
R>4: Пнуть Explorer по MSDN: SHChangeNotify (SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); Выгружается резвее, но не гарантированно.
Разве вызов SHChangeNotify приводит к выгрузке DLL расширения оболочки? Оболочка больше "не воспринимает" соответствующее расширение, но DLL по-прежнему "держит".
Здравствуйте, Аноним, Вы писали:
R>>Если исключить мной описанные способы, то нет. А>А на каком варианте остановились?
А есть варианты?
R>>4: Пнуть Explorer по MSDN: SHChangeNotify (SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); Выгружается резвее, но не гарантированно. А>Разве вызов SHChangeNotify приводит к выгрузке DLL расширения оболочки? Оболочка больше "не воспринимает" соответствующее расширение, но DLL по-прежнему "держит".
Здравствуйте, raspopov, Вы писали:
R>Может есть еще способы или их комбинация?
Интересный способ "подсмотрел" у WinRAR'а. Он переименовывает длл расширения после разрегистрации и помечает ее для удаления после перезагрузки, после чего копирует новую длл и регистрирует ее. Просто, как грабли, и вроде работает.
Здравствуйте, raspopov, Вы писали:
R>Какой способ программно выгрузить уже дерегистрированное расширение оболочки (shell extension) наименее безболезненен для юзера и системы? Подразумевается что в Explorerе уже нет ни одного объекта, просто он по своей обычной привычке держит загруженные библиотеки "на всякий случай". Я рассмотрел такие: R>1: Перегрузить машину. 100% действеннный, 100% раздражающий юзера. R>2: Прибить Explorer по MSDN: PostMessage (FindWindow("Progman",NULL),WM_QUIT,0,0). Не всегда прибивается то, что надо (explorerов может быть много), да и юзер будет весьма удивлен. Кстати при таком способе Explorer не сохраняет свои настройки. R>3: Как-нибудь ухитриться вызвать изнутри Explorerа функцию CoFreeUnusedLibraries. Иногда не работает (по MSDN может ждать до 10 минут), иногда почему-то выгружает чужие расширения причем используемые, как следствие развал всего десктопа. R>4: Пнуть Explorer по MSDN: SHChangeNotify (SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL); Выгружается резвее, но не гарантированно.
R>Может есть еще способы или их комбинация?
Хотелось бы узнать мнение о таком варианте:
1. Определить Explorer.exe процесс
2. Запустить удалённый поток ( CreateRemoteThread )
3. Внутри потока определить HMODULE нужной нам dll по пути ( GetModuleHandle )
4. Запустить FreeLibrary
Плюсы:
+ контролируем процесс освобождения dll
+ гарантировано её выгружаем
Минусы:
— нужны права админа, чтобы установить необходимые привелегии и запустить удалённый поток
— процессов explorer.exe — может быть несколько
— относительно много кода