3

У меня двойная загрузка Windows XP и Windows 7, и я столкнулся со специфической проблемой с иконками для ярлыков.

Для каждой ОС используется отдельный рабочий стол, поэтому у меня есть ярлык на другой для каждой из них для быстрого доступа к обеим версиям Windows; то есть в XP на рабочем столе есть ярлык под названием 7Desk а в 7 на рабочем столе есть ярлык под названием XPDesk . Кроме того, 7Desk.lnk настроен на использование ресурса значков рабочего стола shell32.dll из Windows 7, а XPDesk.lnk настроен на использование ресурса значков рабочего стола shell32.dll из Windows XP. Таким образом, каждый ярлык показывает значок другой ОС для рабочего стола.

Проблема заключается в том, что даже если в диалоговом окне « Изменить значок » я вижу правильные значки (для другой ОС), при нажатии кнопки «ОК» на значке отображается соответствующий значок загруженной в настоящий момент ОС вместо другой. Я подтвердил, что это происходит для других ресурсов значков, а также для значков корзины.

Это сбивает с толку, потому что для Windows (и диалогового окна « Изменить значок ») shell32.dll с другого диска - это просто файл, содержащий значки. Там нет никаких оснований для того , чтобы лечить DLL специально, и еще более загадочный, как она знает , какие из его собственных иконок для использования вместо него. То есть, как XP узнает, как использовать значок рабочего стола XP вместо значка на рабочем столе 7, или как 7 знает, как использовать значок корзины 7 вместо значка корзины XP? И просто, чтобы еще больше запутать, я проверил файлы LNK в hex-редакторе и ясно вижу, что ресурс значка действительно указывает на файл на другом диске, а не просто на \windows\system32\shell32.dll ,

(Конечно, индексы значков одинаковы, поэтому, возможно, он просто использует свою собственную копию shell32.dll вместо той, которая указана на другом диске, но тогда, почему он это делает? Это какой-то «ИИ» в функции « Изменить диалог» , пытающийся делать то, что он думает, что мы хотим, а не то, что мы говорим?)

Я могу записать скриншот, если проблема неясна.

2 ответа2

3

Возможно, что Windows использует LoadLibrary для загрузки DLL с иконками. Когда LoadLibrary видит, что DLL загружена, она будет использовать уже загруженную; проверка основана на имени DLL, а не на местоположении.

В этом случае обходным путем является создание копий обеих библиотек shell32.dll с разными именами (например, shell32-xp.dll и shell32-7.dll), а затем изменение значков для ссылки на эти файлы.

0

Чтобы обойти эту часть копирования, вы можете жестко связать их, каждый на своем диске. Это по крайней мере то, что я сделал. И нет больше суеты иметь несколько копий каждого файла.

fsutil hardlink create \WINDOWS\system32\shell32_xp.dll \WINDOWS\system32\shell32.dll

Этот на стороне XP. На стороне Windows 7 вы заменяете часть _xp на _7 :)

РЕДАКТИРОВАТЬ: я видел, что на стороне Windows 7 не работает. Если вы не нарушите права доступа (с возможностью разрушения всего в системе), вы должны делать это только на стороне XP.

Если вы все еще хотите это сделать, вы должны стать владельцем файла и изменить разрешения, но будьте осторожны!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .