Problème d'icône de raccourci bizarre avec le double démarrage de XP-7

3

Je double-amorce Windows XP et Windows 7 et ai rencontré un problème particulier avec des icônes pour les raccourcis.

Un bureau différent est utilisé pour chaque système d'exploitation. J'ai donc un raccourci vers l'autre pour faciliter l'accès aux deux versions, de l'une ou l'autre version de Windows; c’est-à-dire que, dans XP, le bureau contient un raccourci appelé 7Desket dans 7, le bureau contient un raccourci appelé XPDesk. De plus, 7Desk.lnkest configuré pour utiliser la ressource icône du bureau shell32.dllde Windows 7 et XPDesk.lnkpour utiliser la ressource icône du bureau shell32.dllde Windows XP. Ainsi, chaque raccourci affiche l'icône de l'autre système d'exploitation pour le bureau.

Le problème est que, même si, dans la boîte de dialogue Modifier l'icône, je peux voir les icônes appropriées (pour l'autre système d'exploitation), lorsque je clique sur OK, l'icône affiche l'icône correspondante du système d'exploitation actuellement démarré à la place de l'autre. J'ai confirmé que cela se produisait pour d'autres ressources d'icônes, comme les icônes de la corbeille.

C'est déconcertant car, en ce qui concerne Windows (et la boîte de dialogue Modifier l'icône ), shell32.dlll'autre lecteur ne contient qu'un fichier contenant des icônes. Il n'y a aucune raison pour elle de traiter la DLL spécialement, et encore plus mystérieux est la façon dont il sait que ses propres icônes à utiliser à la place de celui - ci. C'est-à-dire, comment XP sait-il utiliser l'icône du bureau XP à la place de l'icône du bureau 7 ou comment 7 sait-il utiliser l'icône de la corbeille 7 à la place de l'icône de la corbeille XP? Et pour rendre les choses encore plus déconcertantes, j'ai vérifié les fichiers LNK dans un éditeur hexadécimal et je peux clairement voir que la ressource icon est en fait pointée sur le fichier sur l'autre lecteur, et pas simplement \windows\system32\shell32.dll.

(Certes, les index des icônes sont les mêmes, alors peut-être utilise-t-il simplement sa propre copie de shell32.dllau lieu de celle spécifiée sur un lecteur différent, mais pourquoi alors le fait-il ? Est-ce une sorte d’IA dans la modification? Fonction de dialogue , essayer de faire ce qu’elle pense que nous voulons au lieu de ce que nous disons?)

Je peux enregistrer une projection d'écran si le problème n'est pas clair.

Synetech
la source

Réponses:

3

Il est possible que Windows utilise LoadLibrary pour charger la DLL avec les icônes. Lorsque LoadLibrary voit qu'une DLL est chargée, il utilisera celle qui est déjà chargée. la vérification est basée sur le nom de la DLL, pas sur l'emplacement.

Si tel est le cas, une solution de contournement consiste à créer des copies des deux bibliothèques shell32.dll avec des noms différents (par exemple, shell32-xp.dll et shell32-7.dll), puis à modifier les icônes pour faire référence à ces fichiers.

jdigital
la source
Eh bien, je viens de faire que cela semble avoir fonctionné (au moins dans 7; je vérifierai XP la prochaine fois que je redémarre, mais je suppose que ce sera la même chose). Cependant, je ne souhaite pas avoir quatre copies des fichiers de 10 Mo +, alors je vais peut-être simplement extraire les icônes et créer un lien vers celles-ci. Cela semble être une très mauvaise façon de gérer les icônes. Qu'en est-il des fichiers ICO, ICL et EXE? J'imagine qu'il ne fait pas / ne peut pas faire la même bêtise pour ceux-là, alors pourquoi devrait-il gérer les DLL spécialement? Je peux comprendre le faire pour des fonctions, mais pas pour des ressources, du moins pas dans ce contexte. Quoi qu'il en soit, merci pour l'idée; cela semble être correct.
Synetech
Extraire les icônes semble être une bonne idée. Une explication possible de ce problème: extraire des icônes d’une DLL déjà chargée est beaucoup plus rapide et, comme il s’agit d’un cas courant, Microsoft l’a optimisé. Les EXE utilisent probablement la même approche, les ICO, etc. probablement pas.
jdigital
Oui, l'utilisation de ressources à partir de DLL chargées est utile pour certains aspects (en particulier les éléments de l'interface utilisateur), mais pas pour les raccourcis pouvant être utilisés à partir de n'importe où. Je suppose que ceci est un autre exemple de l'esprit étroit typique, ne pensant qu'à mon propre état d'esprit logiciel, auquel de nombreux programmeurs sont soumis. Quoi qu’il en soit, je les ai extraites et cela fonctionne très bien maintenant (même si cela semble un peu bidon et moins «intelligent» et dynamique). :-)
Synetech
0

Pour contourner cette partie de la copie, vous pouvez les lier, chacun sur son propre lecteur. C'est du moins ce que j'ai fait. Et il n’ya plus de problèmes liés à la multiplication des copies de chaque fichier.

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

Celui-ci est du côté XP. Sous Windows 7, vous remplacez la partie _xp par _7 :)

EDIT: J'ai vu que celui sur Windows 7 ne fonctionne pas. Sauf si vous cassez les autorisations (avec une chance de tout détruire dans le système), vous ne devriez le faire que du côté XP.

Si vous souhaitez toujours le faire, vous devez vous approprier le fichier et modifier les autorisations, mais soyez averti à nouveau!

Paul Stelian
la source