как я могу удалить рабочий стол и удалить его dll без перезапуска процесса проводника?

Я создал рабочий стол на панели задач. Когда я хочу обновить DLL дескбенда, я его прячу, отменяю регистрацию, но, к сожалению, проводник все еще хранит эту DLL в памяти.

Как я могу обновить dll без перезапуска процесса проводника? Есть какой-нибудь виндовс апи на такой случай?


person Limor Alon    schedule 22.11.2011    source источник


Ответы (3)


«Неподдерживаемое» (также известное как взлом) решение (C/C++):

HWND hWnd = FindWindowW(L"Shell_TrayWnd", NULL);
if (hWnd != NULL)
    PostMessageW(hWnd, WM_TIMER, 0x18, 0);

Это приведет к вызову функции CoFreeUnusedLibraries в процессе проводника.

Протестировано на 64-разрядной версии Windows 7 Ultimate SP1 и 32-разрядной версии Windows XP Professional SP3.

Кстати, вы можете нажать Windows + D (чтобы свернуть все окна) и подождать 3 минуты. Программный взлом основан на этом поведении. Он просто вызывает обработчик таймера внутри процесса проводника. И код обработчика (C/C++):

KillTimer(hWnd, 0x18);
CoFreeUnusedLibraries();

Нет ничего плохого в вызове функции KillTimer для несуществующего таймера.

person Mosc    schedule 03.01.2012

Нет, нет поддерживаемого способа сделать это. Прежде всего, DLL может быть выгружена, если она вернет true из DllCanUnloadNow пару раз с задержкой между ними, вызванной, например, CoFreeUnusedLibraries, которая должна исходить из процесса проводника. Отмена регистрации не повлияет.

Если вы разрабатываете DLL такого типа, вам нужно привыкнуть к перезапуску проводника.

Мартин

person Martyn Lovell    schedule 22.11.2011

Как говорит Мартин, нет поддерживаемого способа сделать именно то, что вы просите.

Но вы все равно можете сделать процесс обновления менее навязчивым. Просто сделайте так, чтобы DLL вашего плагина служила только базовым интерфейсом для проводника, а все остальное выгрузите в отдельную DLL, которую вы можете явно загружать и выгружать из процесса. Тогда вам нужно только перезагрузить проводник, когда что-то должно измениться в интерфейсе. Если все сделано правильно, вам редко придется обновлять DLL плагина.

person Gerald    schedule 22.11.2011