【发布时间】:2010-11-03 09:19:45
【问题描述】:
说明: 我不记得 Linux 也不知道 OS X,但是在 Windows 中,您可以右键单击一个文件并选择一个程序来打开它。但是操作系统如何确切地知道如何让程序打开它呢?它是否跟踪程序的“打开文件”对话框?开发人员是否必须为这些情况指定一个特殊的事件处理程序或其他东西?
【问题讨论】:
标签: windows file operating-system
说明: 我不记得 Linux 也不知道 OS X,但是在 Windows 中,您可以右键单击一个文件并选择一个程序来打开它。但是操作系统如何确切地知道如何让程序打开它呢?它是否跟踪程序的“打开文件”对话框?开发人员是否必须为这些情况指定一个特殊的事件处理程序或其他东西?
【问题讨论】:
标签: windows file operating-system
对于 Windows,答案在注册表中。如果您习惯阅读注册表,请在您的 Windows 机器上运行 regedit.exe。
在 HKEY_CLASSES_ROOT 下,您将看到所有文件类型、.doc、.txt 等的密钥列表。这些密钥中的每一个都包含一个名为“OpenWithList”或“OpenWithProgIds”的密钥。一个应用程序可能有一个注册的“ProgId”,也可以在 HKEY_CLASSES_ROOT 下找到,它可以将它的 ProgId 注册到它想要在 OpenWithProgIds 中处理的文件类型。否则它会在 OpenWithList 中注册自己。
回应对第一个答案的评论(因为我没有足够的代表发表评论):
您正在考虑 DDE,这是一种几乎已被弃用的技术。 Windows shell 以所选文件作为第一个参数来执行应用程序。
【讨论】:
Windows 资源管理器会根据以下键中的文件扩展名记住您之前的“打开方式...”选项:
HKCR\.ext\OpenWithList下次您右键单击该文件时,它会在那里查找并构建您以前用于打开特定文件类型的程序列表。
假设它找到了一个名为“myapp.exe”的键。然后它在此处查找应用程序:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\myapp.exe获取应用程序安装位置的信息。它在这里:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\myapp.exe按照存储在那里的 GUID 找出应用程序的显示名称。
为了增加乐趣,主要关联的应用程序也在列表中,OpenWithProgIds 键中的所有内容和所有内容:
以及他们各自的HKEY_CURRENT_USER 对应对象。
然后生成的应用程序列表是唯一的,排序和显示。选择后,文件将像您单击的任何其他文件一样启动 - 即:
C:\path\to\myapp.exe "C:\path\to\the\file.ext"【讨论】:
文件关联存储在注册表中:HKEY_CLASSES_ROOT。
您可以使用 Windows 资源管理器以图形方式管理它们:(WinXP)
单击工具/选项/文件类型
或者使用控制面板中的“默认程序”小程序。 (远景)
【讨论】:
只是出于怀旧之情,相当出色的Acorn archimedes 有一个更好的系统,每种文件类型都有一个唯一的类型编号,以及随文件写入的制造商和应用程序代码(相当像 MAC 地址)。
这意味着您可以使用正确的应用程序打开所有名为 .bak 的不同文件 - 不像 Windows 的情况,新安装的应用程序会窃取该类型的每个现有文件的所有权。 Autocad 在这方面尤其糟糕,注册了大约 20 种文件类型。
【讨论】:
操作系统运行指定的程序,将要打开的文件的路径作为参数发送。
例如,在 C# 中,如果您想知道操作系统希望您打开哪个文件,您需要这样做:
class Program
{
static void Main(string[] args)
{
if (args.Length == 1) //The OS wants me to open a file
openSomeFileJustBecauseTheOSWantsIt(args[0]);
}
}
【讨论】: