在现代Windows上从Windows XP运行图像查看器

我有一个目录,其中包含我在上世纪90年代收集的旧图像。 每次升级时,我会将其所有其他文件从一台计算机移动到另一台计算机。 时不时地,当我感到怀旧时,我打开它并翻阅图片。 有一些带有动画的GIF文件,每次我注意到Windows 7的默认图像查看器都不支持它。 我记得,Windows XP中的图像查看器能够正确播放GIF动画。 因此,我花了一些时间克服一些障碍,并在现代Windows上运行旧的图像查看器,为此创建了一个小型启动器。 现在,我可以在Windows XP的旧图像查看器的真实界面中观看这些旧图像。


下载: shimgvw_xp32.7z (包括启动器的二进制代码和源代码,以及来自英语Windows XP SP3的shimgvw.dll)。

怎么做的?


Windows XP中的默认图像查看器不仅仅是一个应用程序。 它是由Windows资源管理器从shlimgvw.dll动态库执行的。 无法直接执行它,为此您需要像rundll32这样的中介程序(需要到现有映像文件的路径):

rundll32 c:\windows\system32\shimgvw.dll,ImageView_Fullscreen c:\test.gif 

但是,当您尝试在Windows 7上从Windows XP运行shimgvw.dll时,此技巧不起作用。shimgvw.dll需要启用Windows XP兼容模式。 可以通过为rundll32的副本设置此兼容模式来做到这一点,但这是一个丑陋的破解,并且会导致在每次查看器运行时都显示UAC对话框,因此不合适。

经过短暂的调试,我找到了罪魁祸首。 shimgvw.dll从shunimpl.dll隐式导入了一些已弃用的shell函数,如果没有ATOM“ FailObsoleteShellAPIs”,则后者会拒绝加载(否则它会正确加载,但是过时的函数会返回错误代码)。 Windows XP兼容模式添加了此ATOM(除了很多其他功能),这就是为什么图像查看器可以在此模式下运行的原因。

实现了shimgvw.dll的轻量级加载程序。 它添加了ATOM“ FailObsoleteShellAPIs”,询问应打开哪个图像(如果未将其作为参数传递),然后将执行传递给shimgvw.dll。 查看器正常工作,因此我没有研究过时的Shell函数的用途。 至少,这不是至关重要的。

Source: https://habr.com/ru/post/zh-CN437436/


All Articles