前言:

本文是基本原理介绍和手动的操作。程序实现该功能在http://blog.csdn.net/arvon2012/article/details/7839556,同时里面有完整代码的下载。

今天在开发程序的时候,需要做后缀和程序的关联,所以写下详细的操作过程跟大家分享。有什么意见欢迎留言!

目标:我这次要自定义一个后缀名(.seve),并且自己开发一个负责打开这种后缀文件的程序(Opo.exe)。当双击后缀名为我自定义的文件时,自动运行我的程序(Opo.exe)。

概要原理:
对windows来说,双击一个文件时,windows会根据他注册表中的记载打开和当前文件后缀名关联的程序。如默认情况下:.txt关联的是NODEPAD.exe,.doc关联的是word。所以要进行关联,就是要做注册表的修改。修改注册表,可以通过手动方式,也可通过注册表编程实现。

那么注册表中是怎么把指定的后缀和指定的程序关联的?
我们用实例讲解,这里的系统是XP(WIN7系统的注册表和XP至少在这里用到的地方都是一样的),点击开始——运行,输入regedit(这个命令用了很久,但是我比较笨,后来才看出来其实就是register edit(注册表编辑)的简写)。
打开后可以看到几个“键”,我们关心的和后缀名相关的,他们在HKEY_CLASSES_ROOT下面。点开后,点编辑——查找,然后在查找栏中输入.txt就自动跳转到.txt所在的位置,大家在右边可以看到如下内容:

按顺序讲下这三个值:
1.(默认):在关联中最重要的一个值,决定了当前后缀的文件交给谁并且怎么处理,这里大家看到的内容是“txtfile”。其实这个.txt键只是相当于一个索引,该键中并没有实际的处理说明,而实际的处理都交给了另一个键,那个键的名字就是这里的“(默认)”给出的。(着急的童鞋现在就可以在注册表中搜txtfile键)

2Content Type:这里指定了这个文件内容是什么类型,这个值可以接受很多参数,这个参数的列表可以再MSDN中查找Content Type看到。这个值存在的意义是当系统要处理这个文件内容的时候,和这个后缀名关联在一起的程序会根据这个值决定如何打开并展现文件中的内容。

3.PerceivedType:这个值也是一个类型的标记。他的用处呢?举个例子大家就有感觉了,如果这个值的内容是video的时候。我们打开一些视频播放器,许多播放器第一次打开很可能会搜索电脑硬盘,寻找可以播放的文件并展现在“播放列表”中,而这个搜索过程就是根据这个值进行的。

下面跳转到负责真正处理和打开工作的键中,对于我们的例子.txt,这个处理键,上面已经说了,就是txtfile,找到该键,并且全部展开,可以看到如下内容:

PS:在关联后缀名和打开程序中,都是两个键成对工作的,比如这里的.txt和txtfile键。我们暂且称第一个是“后缀键”第二个是“处理键”。这样方便后面表达。

上面的图中,大家可以看到txt文件的处理键的层次内容。选中最顶层的txtfile看右边界面显示的内容:

1.(默认):这里是文件类型的说明,大家右击文件图标,选择属性的时候,在属性中的文件类型框中可以看到这个值。
2.EditFlags:标识这个文件的读写权限,比如是只读,还是可读写。。。等等,这个在文件属性里也能修改。
3.FriendlyTypeName:这个值是应用程序的友好名称(晕菜,什么是友好名称?这里先说下不友好名称是什么:应用程序的ID,没错,就是看也看不懂的那一串数字,所以你在这里看到的这个值已经很适合人脑去理解了,很友好!)。这个值其实就是说明这个处理键对应的应用程序是哪个,大家打开文件属性找一找,也能找到这个值的身影。不过记住,这个值可不是起决定作用。决定作用在子键中。

现在回到txtfile键层次图中:

可以看到这个处理键的直接子键有两个:1.DefaultIcon这一类文件的默认图标。2.Shell,存放了对这类文件进行实际操作时,执行的命令。

我们直接看重点:

shell键:
在这个键中,可以看到三个子键:open,print,printto,这里列出的可以执行的命令,其实和鼠标右击这个文件时候,弹出的菜单中的命令对应。我们关心的是打开操作,所以这里我们看下open键下的command里存的是什么:
默认键:%SystemRoot%\system32\NOTEPAD.EXE %1
看到木有?这里真正的指定了由谁来打开这种后缀的文件。这里是NOTEPAD.EXE。
和open键平行的建都是一些操作,大家感兴趣可以一个个打开研究研究。

实现关联
既然知道注册表中后缀和程序是怎么关联的,我们就也来关联一组。
后缀:opo
程序:Opo.exe

1.手动方式
我们先手动创建,之后再说程序实现,原理上都一样,只不过程序的比较帅,当然也比较高端(在某些应用场合)。
鼠标右击HKEY_CLASSES_ROOT,弹出菜单,选新建——项

1.后缀键
创建:然后会创建一个键,我们给它输入名字,这里的名字就是后缀名:.opo。
写值:选中该键,然后在右边的界面中双击(默认),弹出对话框,我们在值中输入处理键的名字:opofile。
后缀键完成!

2.处理键
创建:和上面一样,名字写成上面的键的(默认)值opofile
我们就是要关联打开应用,其他乱七八糟的东西我们先不关心,所以如下:

右击opofile,在opofile键下创建键shell,shell下创建键open(定义打开命令),open下创建子键command。
写值:选中command,然后双击右边的默认,在弹出框中的写入程序Opo.exe的位置后面加上%1,我的是这样的:

测试
现在随便找个小程序,名字改成Opo.exe,然后自己创建一个文本文件,重命名成后缀为opo的文件。然后双击这个文件,额。。。。
这就是所谓的后缀名和程序的关联,完成!嘿嘿

WIN7/XP用注册表关联指定后缀名和打开程序(手动【图文】和C编程两种实现)的更多相关文章

  1. Linux关联文件扩展名和打开程序

    手动为Linux关联文件扩展名与打开程序. 当Linux不认识某种扩展名的时候,需要为此扩展名创建一个MIME类型.Linux是依据MIME类型而不是扩展名来决定打开程序的. 再将此种MIME类型与某 ...

  2. Java基础知识强化之IO流笔记49:IO流练习之 复制指定目录下指定后缀名的文件并修改名称的案例

    1. 复制指定目录下指定后缀名的文件并修改名称的案例     需求:复制指定目录下的指定文件,并修改后缀名.  • 指定的文件是:.java文件.     • 指定的后缀名是:.jad     • 指 ...

  3. Navicat查询哪些表有指定字段名

    通常需要查询某个字段来自于哪张表,在navicat中没有直接查哪些表有指定字段名的功能,只能用sql来查. 1.(按字段名查表)查询哪些表有指定字段名(比如查字段名article_id)的SQL: S ...

  4. IO流-递归遍历目录下指定后缀名结尾的文件名称

    /* *自定义遍历目录下指定后缀名结尾文件的名称的方法: * * param file:指定目录 name:指定后缀名 */ 1 public static void FileName(File fi ...

  5. C#中获取指定路径下指定后缀名的所有文件的路径的list

    场景 指定一个路径和后缀名,查找这个路径下所有以此后缀名结尾的文件. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取 ...

  6. qt注册表关联文件格式

    注册表相关知识:http://www.360doc.com/content/12/0812/19/3688062_229808059.shtml(超详细超实用) 将某种类型的格式关联到某个可执行程序, ...

  7. win2003、win7下操作注册表

    在win2007里,web程序仅对LOCAL_CURRENT_USER能进行读(写:没有进行测试)操作. 在本地的IIS里运行的web程序,如需访问注册表,需要将对应的应用程序池中的标识里面的用户,改 ...

  8. Java 修改Windows注册表,以实现开机自启动应用程序。

    使用Java修改Windows注册表,使用最基本的就是cmd命令. 事例和运行结果如下所示: package day01; import java.io.IOException; /* 1,reg a ...

  9. Windows删除指定时间之前指定后缀名的文件

    时间判定标准:文件创建时间 实例:删除 D:\backup 目录下(包括子文件夹),7天前 “.bak”后缀名的文件及30天前后缀名为 “*.log” 的文件 批处理: @echo off echo ...

随机推荐

  1. Web前端,HTML5开发,前端资源,前端网址,前端博客,前端框架整理 - 转改

    Web前端/H5开发,前端资源,前端网址,前端博客,前端框架整理 综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v ...

  2. c链表之oc AutoReleasePool

    直接贴 原文吧: http://blog.sunnyxx.com/2014/10/15/behind-autorelease/

  3. linux每日命令(10):touch命令

    linux的touch命令一般用来修改文件时间戳,或者新建一个不存在的文件. 一.命令格式: touch [参数]... 文件... 二.命令参数: 参数 描述 -a 或--time=atime或-- ...

  4. js的new Date()日期的使用

    <script type="text/javascript"> //js获取某个月的天数 function days(year,month){ var dayCount ...

  5. 【转】Ubuntu FireFox无法播放网页视频音乐的解决办法

    原文:http://www.codeweblog.com/%E8%A7%A3%E5%86%B3qq%E9%9F%B3%E4%B9%90%E7%BD%91%E9%A1%B5%E7%89%88%E5%9C ...

  6. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-13 emWin底层驱动接口介绍

    视频简介:该视频介绍emWin底层驱动接口. 源视频包下载地址:链接:http://pan.baidu.com/s/1nvPpC2d 密码:cbb7 银杏科技优酷视频发布区:http://i.youk ...

  7. iTunes空间不足无法备份iphone的问题

    因为换手机,需要把旧iphone备份出来,在新iphone上恢复.使用mac进行备份时总是提示iTunes无法备份,所用电脑空间不够,即使有个用空间的移动硬盘也无法备份.网上的方法都是说修改iTune ...

  8. Java知多少(28)super关键字

    super 关键字与 this 类似,this 用来表示当前类的实例,super 用来表示父类. super 可以用在子类中,通过点号(.)来获取父类的成员变量和方法.super 也可以用在子类的子类 ...

  9. 一起了解下Centos中‘vim配置’有多强大?

    在linux的系统上安装vim编辑器后,发现vim的页面设置还是不太习惯,没有显示的行号,也没有自动的缩进,页面的背景也不是很好看,但是vim编辑器是可以进行配置的,我们可以打造属于自己的vim风格. ...

  10. LVS DR模式搭建 keepalived lvs

    LVS DR模式搭建• 三台机器 • 分发器,也叫调度器(简写为dir)172.16.161.130 • rs1 172.16.161.131 • rs2 172.16.161.132 • vip 1 ...