Как я могу удалить рабочий стол и удалить его DLL без перезапуска процесса проводника? - PullRequest
0 голосов
/ 22 ноября 2011

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

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

Ответы [ 3 ]

3 голосов
/ 03 января 2012

Решение «Unsupported» (также называемое взломом) (C / C ++):

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

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

Протестировано в Windows 7 UltimateSP1 64-bit и Windows XP Professional SP3 32-bit.

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

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

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

0 голосов
/ 22 ноября 2011

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

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

0 голосов
/ 22 ноября 2011

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

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

Martyn

...