J'ai un répertoire avec des images anciennes que j'ai collectées dans les années 2000. Je le déplace avec tous mes autres fichiers d'un ordinateur à un autre à chaque mise à niveau. De temps en temps, quand je me sens un peu nostalgique, je l'ouvre et regarde à travers les images. Il y a quelques fichiers GIF avec animation, et chaque fois que je remarque que la visionneuse d'images par défaut de Windows 7 ne la prend pas en charge. Je me suis souvenu que la visionneuse d'images de Windows XP était capable de lire correctement l'animation GIF. J'ai donc passé un peu de temps à surmonter quelques obstacles et à exécuter l'ancienne visionneuse d'images sur Windows moderne, un petit lanceur a été créé à cet effet. Maintenant, je peux regarder ces anciennes images dans l'interface authentique de l'ancienne visionneuse d'images de Windows XP.
Téléchargement: shimgvw_xp32.7z (inclut un code binaire et source du lanceur et le shimgvw.dll de l'anglais Windows XP SP3).
Comment cela at-il été fait?
La visionneuse d'images par défaut de Windows XP n'est pas seulement une application. Il est exécuté par l'Explorateur Windows à partir de la bibliothèque dynamique shlimgvw.dll. Il n'est pas possible de l'exécuter directement, vous avez besoin d'un médiateur comme
rundll32 à cet effet (le chemin vers un fichier image existant est requis):
rundll32 c:\windows\system32\shimgvw.dll,ImageView_Fullscreen c:\test.gif
Mais cette astuce ne fonctionne pas lorsque vous essayez d'exécuter shimgvw.dll à partir de Windows XP sur Windows 7, le shimgvw.dll nécessite le mode de compatibilité Windows XP activé. Il est possible de le faire en définissant ce mode de compatibilité pour une copie de rundll32, mais c'est un hack laid, et cela provoquera l'affichage de la boîte de dialogue UAC à chaque exécution de la visionneuse, donc ce n'est pas approprié.
Après une courte session de débogage, j'ai trouvé le coupable. Le shimgvw.dll importe implicitement certaines fonctions de shell obsolètes du shunimpl.dll, et cette dernière bibliothèque refuse de se charger s'il n'y a pas d'ATOM «FailObsoleteShellAPIs» (sinon il se charge correctement, mais les fonctions obsolètes renvoient des codes d'erreur). Le mode de compatibilité Windows XP ajoute cet ATOM (en plus de beaucoup d'autres choses), c'est pourquoi la visionneuse d'images est capable de fonctionner dans ce mode.
Un chargeur léger pour le shimgvw.dll a été implémenté. Il ajoute ATOM «FailObsoleteShellAPIs», demande quelle image doit être ouverte (si elle n'a pas été passée comme argument), puis passe l'exécution au shimgvw.dll. La visionneuse fonctionne correctement, donc je n'ai pas cherché à quoi ces fonctions de shell obsolètes sont utilisées. Au moins, ce n'est pas quelque chose de crucial.