Jon*_*nes 5 windows-explorer file-association context-menu winrar
到目前为止,我知道 Windows 基于文件扩展名而不是文件类型显示上下文菜单。我刚刚用带有 mp3 扩展名的空文本文件和 winamp 进行了测试,结果如下:

与我测试扩展名为 exe 的空文件的方式相同,Windows 为我提供了上下文菜单,例如“以管理员身份运行”等。

但是,如果我创建一个具有相同 exe 扩展名的 sfx 存档,Windows 如何为我提供不同的图标,而 WinRAR 如何为我提供特殊的上下文菜单,例如“在此处提取”,如下图所示?

我的问题是 Windows 阅读器文件头并代表相关数据还是 WinRAR 有任何特殊的文件检测方案?我怀疑第二个,因为在上下文菜单创建期间没有调用 WinRAR。
另一个问题是,如果是因为 Windows 读取标题的行为(比如它为图片或视频创建缩略图),现在扩展的重要性降低了?它们对上下文菜单没有任何影响吗?
Windows 上下文菜单处理程序既可以是静态的,也可以是动态的。如果您有兴趣进一步深入研究,我建议您阅读Shortcut (Context) Menus and Shortcut Menu Handlers文章,尤其是选择静态或动态快捷菜单方法和使用动态动词自定义快捷菜单。
引用这本Visual Basic Shell Programming书摘录:
动态上下文菜单
静态上下文菜单是有限的,因为它们对于给定类型的每个文件对象都是相同的。此外,可以通过静态菜单处理的文件数量受用于执行命令的程序的限制。如果您需要处理 20 个文件怎么办?如果根据文件本身的状态需要不同的处理选项怎么办?在某些情况下,您可能需要一个上下文菜单用于一组文件而另一个用于单个文件。这就是动态上下文菜单发挥作用的地方。
...
您可能希望根据选择的是一个文件还是多个文件来显示不同的菜单项。由于可以在 IShellExtInit::Initialize 中确定所选文件的数量,因此这变得无关紧要。您还可以将菜单项基于文件本身。除了选择的文件数量外,您还应该知道相关文件名。这意味着您可以打开文件、检索信息并根据实际数据创建菜单项。或者,您可以检查文件的某些其他属性(例如,其创建日期、大小或只读状态),并将菜单项也基于该信息。
最后,如果你想证明文件实际上被 WinRAR 的外壳扩展 DLL 读取(因为你似乎怀疑它),这里是进程监视器注册的各种ReadFile调用,只需右键单击 WinRAR SFX:

(进程名称显示为 explorer.exe 而不是rareext.dll,因为上下文菜单处理程序是一个“进程内”COM 对象,shell 将其直接加载到 explorer.exe 的内存空间以供执行。)
如您所见,它读取前 7 个字节以确认它是一个 EXE:

在读取更多数据后(无疑是为了获取和解析头文件),它然后从偏移量 101,376 读取 7 个字节以确认它是一个 WinRAR SFX 而不是任何旧的 EXE:

这会提示它添加各种上下文菜单条目,例如使用 WinRAR 打开、使用 WinRAR 提取等,这些条目不会为“普通”EXE 添加。
此外,在 WinRAR 的“设置”对话框中,有一个标题为Where to check for SFX archives的选项:

以下是帮助文件对此的说明:
“在哪里检查 SFX 档案”选项控制上下文菜单中 SFX 档案的处理。检查可执行文件的内容并检测它是否是自解压 (SFX) 存档会在右键单击每个“.exe”文件时引入一些延迟,因为 WinRAR 需要读取和分析文件数据以找出它是否是 SFX。虽然这种延迟对于快速的本地硬盘驱动器可以忽略不计,但在网络磁盘速度较慢的情况下可能会很明显。这组选项允许分别为本地硬盘、网络磁盘和其他磁盘(如 CD-ROM 和 USB)启用或禁用 SFX 处理。如果关闭这些选项,右键单击 SFX 存档时,您将不会看到所有与 SFX 相关的上下文菜单项。因此,仅当您在右键单击“.exe”文件时确实遇到延迟时才禁用这些选项。
希望能打消你的疑虑。:) 至于您关于扩展现在是否“不那么重要”并且“对上下文菜单[s] 没有任何影响”的第二个问题,我不明白您的意思。甚至图像/视频缩略图也是由外壳扩展处理程序 (DLL) 生成的。可以在此处找到不同处理程序的列表。如您所见,可以为快捷菜单、拖放操作、图标、图标覆盖、属性表、缩略图、信息提示、元数据、资源管理器列、复制/移动/删除/重命名对话框等所有内容提供自定义 shell 扩展处理程序, 搜索...
编辑:巧合的是,Raymond Chen今天也恰好发布了一篇关于 shell 扩展的文章(不要忘记阅读上一篇)。
| 归档时间: |
|
| 查看次数: |
1974 次 |
| 最近记录: |