Tengo un directorio con imágenes antiguas que reuní en los años noventa. Lo muevo con todos mis otros archivos de una computadora a otra en cada actualización. De vez en cuando, cuando me siento un poco nostálgico, lo abro y miro a través de las imágenes. Hay algunos archivos GIF con animación, y cada vez me doy cuenta de que el visor de imágenes predeterminado de Windows 7 no lo admite. Recordé que el visor de imágenes de Windows XP podía reproducir correctamente la animación GIF. Entonces, pasé un poco de tiempo para superar algunos obstáculos y ejecutar el viejo visor de imágenes en Windows moderno, se creó un pequeño iniciador para este propósito. Ahora puedo ver estas imágenes antiguas en la interfaz auténtica del antiguo visor de imágenes de Windows XP.
Descargar: shimgvw_xp32.7z (incluye un código fuente y binario del iniciador y shimgvw.dll del SP3 de Windows XP en inglés).
¿Cómo se ha hecho?
El visor de imágenes predeterminado de Windows XP no es solo una aplicación. Es ejecutado por el Explorador de Windows desde la biblioteca dinámica shlimgvw.dll. No es posible ejecutarlo directamente, necesita un mediador como
rundll32 para este propósito (se requiere la ruta a un archivo de imagen existente):
rundll32 c:\windows\system32\shimgvw.dll,ImageView_Fullscreen c:\test.gif
Pero este truco no funciona cuando intenta ejecutar shimgvw.dll desde Windows XP en Windows 7, el shimgvw.dll requiere el modo de compatibilidad con Windows XP habilitado. Es posible hacerlo configurando este modo de compatibilidad para una copia de rundll32, pero es un truco feo y provocará la visualización del diálogo UAC en cada ejecución del visor, por lo que no es apropiado.
Después de una breve sesión de depuración, encontré al culpable. El shimgvw.dll importa implícitamente algunas funciones de shell obsoletas del shunimpl.dll, y la última biblioteca se niega a cargar si no hay ATOM "FailObsoleteShellAPIs" (de lo contrario, se carga correctamente, pero las funciones obsoletas devuelven códigos de error). El modo de compatibilidad con Windows XP agrega este ATOM (además de muchas otras cosas), es por eso que el visor de imágenes puede ejecutarse en este modo.
Se implementó un cargador ligero para shimgvw.dll. Agrega ATOM "FailObsoleteShellAPIs", pregunta qué imagen debe abrirse (si no se pasó como argumento) y luego pasa la ejecución al shimgvw.dll. El visor funciona correctamente, por lo que no he investigado para qué se utilizan esas funciones obsoletas de shell. Al menos, no es algo crucial.