在现代Windows上从Windows XP启动图像查看器

我有一个包含旧照片的文件夹,这些文件夹以零收集。 每次升级时,我都会从计算机转移到计算机以及所有文件,有时我会怀旧。 但是每次我都为标准的Windows 7查看器不显示GIF动画感到有些尴尬,尽管我的记忆告诉我,在XP时代,动画显示没有问题。 随着下一次的怀旧攻击,我仍然决定在Windows 7上从XP启动查看器。克服了许多障碍之后,我现在可以确定那里确实支持GIF动画! 最重要的是-现在,我可以在Windows XP图片查看器的真实界面中观看带有图片的旧文件夹,这会产生更合适的氛围=)


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

这是怎么做的?


Windows XP中的标准图像查看器不是常规应用程序。 它位于shimgvw.dll库中,您不能直接运行它-至少需要rundll32 (需要指向现有映像文件的路径):

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

但是,当尝试在Windows 7及更高版本上从Windows XP运行shimgvw.dll时,此技巧不起作用-shimgvw.dll无法加载,它需要Windows XP兼容模式才能正常工作。 这可以通过为rundll32副本设置适当的兼容模式来实现,但是与XP的兼容性意味着将应用程序权限提高到最大,这会导致UAC对话框在每次启动时出现,我想避免这种情况。

与调试器的一些舞步使得找出原因成为可能-在启动过程中,shimgvw.dll随后尝试从shunimpl.dll导入几个函数,这些函数存储了过时的shell函数,并且如果ATOM“ FailObsoleteShellAPIs”不存在,则后者默认情况下拒绝加载(此ATOM的存在允许加载库,但是所有过时的函数只会返回错误代码)。 XP兼容模式等设置了此ATOM,因此查看器启动。

决定写一个小的加载器,添加ATOM“ FailObsoleteShellAPIs”,询问打开哪个图像(如果未在参数中指定路径),然后将控制权转移到shimgvw.dll。 查看器工作正常(即,初始任务已完成),因此我没有调查从shunimpl.dll导入了哪些过时的函数以及在什么情况下使用了它们-显然,它们对查看器的工作没有任何关键作用。

由于实现加载程序不需要少量的WinAPI函数,因此我决定作为一个实验使用Clang构建项目,而无需使用运行时(以前,我总是使用MSVC进行此类舞步)。 因此,获得了一个大小为14 KB的可执行文件,其中9 KB进入了该图标。 如果有人还喜欢制作不依赖于非标准库的小工具,则该项目可以作为使用Clang进行此操作的一个小示例。

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


All Articles