关于文件类型关联的那些事

来源:互联网 发布:linux如何压缩文件夹 编辑:程序博客网 时间:2024/06/10 09:16

    大概在一年前做过文件类型关联方面的ticket,当时没有做记录,现在又做这方面的ticket发现已经忘的差不多了,哎,记忆力是越来越差了啊。

    “写下来不就不用记了”。-_-谢谢了,既能与广大网友们分享,又不会忘记自己做过的东西,何乐而不为呢。呵呵,这也要感谢csdn给我们提供这么好的平台了。

 

    先来看看文件类型关联相关的基础知识吧。(注:这部分是看别人写的,感谢作者了,具体是谁写的我也不记得了,如果作者看见了,告诉我,我一定把您的大名写上,太经典,太有用的文章了)

 


 

    Windows 操作系统是一个图形界面的操作系统,在大部分情况下,用户只需要使用鼠标,就可以完成需要做的工作。这所带来的便利性中,有一部分要归功于文件类型关联。双击DOC文件,就可以自动打开Word字处理程序:双击TXT文件,就自动打开记事本来编辑它,这就是文件类型关联。文件类型关联的实质,就是允许用户将某种类型的文件和处理它的程序之间联系起来,这样用户不需要记忆该文件类型对应的处理程序,这个工作已经交给Windows来做了。而在传统的命令行操作系统中,如DOS系统,要编辑TXT文件,就必须输入命令“Editfile.txt”。也就是说,必须知道程序Edit可以用来处理TXT文件。
    文件类型关联是怎么实现的呢?来看—看双击一个文本文件时发生的事情。文本文件是一个以TXT为扩展名的文件。
    1双击该文件时,Windows首先检查该文件的文件扩展名,得到其扩展名是TXT。
    2到注册表的注册表项HKEY_CLASSES_ROOT下查找是否有.TXT子项。
    3得到.TXT注册表项的默认值项的值。默认情况下为txtfile。
    4在注册项HKEY_CLASSES_ROOT下查找是否有txtfile子项。
    5找到txtfile子项后,再得到其下Shell/open/command子项的默认值项,例如,为%SystemRoot%/system32XNotepad.exe%1。
    6将文本文件的名称替换%1,然后运行该命令,例如,文本文件为C:/test.txt,则系统将执行%SystemRoot%/system32kNotepad/exe C:/tcst.txt。

    在Windows中,文件类型是通过文件扩展名来识别的,例如,以TXT为扩展名的就是文本文件,以BMP为扩展名的就是位图文件。Windows将所有的可识别的文件类型都存放在HKEY_CLASSES_ROOT下,并且在HKEY_CLASSES_ROOT中存放了该文件类型的相关信息,如该文件类型的关联程序、该文件类型的显示图标、上下文关联菜单等。除了特定的文件类型外,Windows还定义了几种特殊的文件类型,如目录、文件夹、驱动器等。


    HKEY_CLASSES_ROOT也写成HKCR(在应用程序中使用HKCR来指代HKEY_CLASSES_ROOT),包含了文件类型信息和OLE信息。

   
    在Windows95/98/NT中,HKEY_CLASSES_ROOT是HKEY_LOCAL_MACHINE/SOFTWARE/Classes的映射;
    在Windows2000/XP/2003/vista中,HKEY_CLASSES_ROOT的内容来自两个地方,一个是HKEY_LOCAL_MACHINE/SOFTWARE/Classes,另外一个是HKEY_CURRENT_USER/SOFTWARE/Classes。HKEY_CLASSES_ROOT是它们的合集,也就是说,这两个注册表项下有的内容,在HKEY_CLASSES_ROOT目录树下肯定有。如果HKEY_LOCAL_MACHINE/SOFTWARE/Classes和HKEY_CURRENT_USER/SOFTWARE/Classes的某个内容有冲突,则HKEY_CLASSES_ROOT下显示的是HKEY_CURRENT_USER/SOFTWARE/Classes的内容。
  
    Windows2000/XP/2003/vista的注册表结构和Windows95/98/NT的注册表结构有个很大的区别就在于HKEY_CLASSES_ROOT:
    在Windows95/98/NT中,HKEY_CLASSES_ROOT只是HKEY_LOCAL_MACHINE/SOFTWARE/Classes的镜像,所有的用户使用相同的HKEY_CLASSES_ROOT。
    在Windows2000/XP/2003中,各个用户的HKEY_CLASSES_ROOT允许不同,这种情况叫做单用户类注册(Per-UserClassRegistration)。


    单用户类注册有如下好处。
    (1)同—台计算机上的不同用户可以分别定制他们的Windows。
    在Windows95/98/NT中,各个用户各自的HKEY_CURRENT_USER是不同的,但是有关文件类型、COM信息等内容都是存放在HKEY_CLASSES_ROOT下,所有的用户是共享的。因此如果一个用户更改了HKEY_CLASSES_ROOT,所有的用户都会受到影响,例如,用户A安装了ACDSee这个图形软件,ACDSee更改了BMP文件类型信息,将BMP文件和ACDSee图形软件对应起来,当用户甲在资源管理器中双击BMP文件时,将自动地调用ACDSee图形软件;而随后用户B安装了Photoshop图形软件,Photoshop软件又修改了BMP文件类型的信息,将BMP文件和Photoshop图形软件对应起来,当用户A在资源管理器中双击BMP文件时,将自动调用Photoshop图形软件,而不会调用用户A安装ACDSee软件。有了单用户类注册这个特性,就不会出现这种混乱情况,用户A双击 BMP文件,仍然将自动调用ACDSee软件。
    (2)提高了注册表的安全性。
    在Windows9x/NT中,由于所有的用户共同共享一个HKEY_CLASSES_ROOT,为了用户能够正常地使用各个应用程序,通常允许用户修改HKEY_CLASSES_ROOT,这也意味着用户A可以修改用户B创建的内容。使用单用户类注册后,各个用户有自己的 HKEY_CLASSES_ROOT,不再需要通过修改HKEY_LOCAL_MACHINE/SOFTWARE/classes来满足自己的需求,这样系统管理员可以提高HKEY_LOCALMACHINE/SOFTWARE/classes的权限,禁止普通用户修改它,而各个用户之间更是不能修改对方的HKEY_CLASSES_ROOT。

    (3)支持漫游类注册。
  在Windows2000中,提供了一个叫做IntelliMirror的功能。通过在服务器和客户端同时使用IntelliMirror,用户的数据、应用程序和设置在所有的环境中都可以跟随用户漫游,这当然包括了用户的配置文件。当用户登录到域中任意一台运行Windows 2000的计算机时,首先要通过目录服务中的身份验证,身份验证通过后,保存在服务器上的用户配置文件(包括注册表中的HKEY_CLASSES_ROOT)将复制到该计算机土,就好像用户是在本地计算机登录一样。

 


 

    文件类型关联

    通过学习上面的基础知识我们知道,要让带我们自己的后缀的文件用我们自己的程序打开必须经过以下3步:

    假设我们自己的后缀为.skn, 我们自己的程序的安装路径为d:/program/skin.exe

    1 写注册表HKEY_CLASSES_ROOT/.skn的默认值为skinfile(这个skinfile可以随便取,主要是为了查找第2步程序路径用的)

    2 写注册表HKEY_CLASSES_ROOT/skinfile/shell/open/command的默认值为d:/program/skin.exe

    3 确保HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/FileExts/.skn下不存在子键Progid和Application,或者存在但他们的值为skinfile

vista及以后的系统HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/FileExts/.skn/UserChoice下不存在子键Progid和Application,或者存在但他们的值为skinfile

    注意:第3步是必须的,而且是最重要的,第3步的条件不满足,即使第1,2步都做了也不能关联上的。

    有了这3步(这3步的顺序可以随便换的),你双击.skn的程序就会默认用skin.exe打开了。

 

    在关联文件类型的时候你会发现vista以下的系统都可以正常工作,但在vista系统中却需要管理员权限,因为只有管理员才有权限去直接修改HKEY_CLASSES_ROOT下的键值。那怎么在没有权限的情况下修改HKEY_CLASSES_ROOT下的键值呢?

    呵呵,很简单,不就是让HKEY_CLASSES_ROOT上面有我们想要的键嘛,我们知道vista系统下HKEY_CURRENT_USER是不需要权限就能修改里面的键的。知道了这个就好办了,通过学习上面的基础知识我们可以知道,HKEY_CLASSES_ROOT在多用户系统中(Windows 2k/xp/2003/vista)其实是HKEY_CURRENT_USER/SOFTWARE/Classes和HKEY_LOCAL_MACHINE/SOFTWARE/Classes键下面的映射,而且是优先映射HKEY_CURRENT_USER/SOFTWARE/Classes的,那我们完全可以通过往HKEY_CURRENT_USER/SOFTWARE/Classes里写键值来达到修改HKEY_CLASSES_ROOT下面键值的目的的(注意:此时修改的HKEY_CLASSES_ROOT只是在当前用户下有效,别的用户下是无效的)。KO -_-!

    文件类型关联不光是双击就能用我们程序打开,而且我们还可以设定.skn类型用什么样的图标显现,这就需要往HKEY_CLASSES_ROOT/skinfile/DefaultIcon键写默认值为程序图标所在的路径了像"d:/program/skin.exe",-119 后面的119表示是图标资源的程序中的id。

 

    以上关联的步骤都编程验证测试通过。

 

    欢迎大侠们拍砖,扔石头。有不对的地方请务必纠正,大家共同分享,谢谢先。