使用反射为指定的文件类型创建关联

为指定的文件类型设立关联有很多方法,但这些方法在.Net中不能直接使用,今天从以前的代码中抽取一段利用反射功能实现建立文件类型关联的部分代码,以抛砖引玉,如有不妥之处,万望指教。

背景:这段代码是在我的一个小程序中使用到的,这个程序是一个自动代码生成器,名字叫做MyCodeCreator,有一个Solution的项目文件,扩展名为:mcclsn,现在我们为这个扩展名建立关联。

大家都知道建立关联无非是在注册表中动手脚,参考其它的扩展名的例子,我写了以下代码:

注册表存取方法
 1        static RegistryKey OpenOrCreateSubKey(RegistryKey parent, string name, out eStatus status)
 2        {
 3            status = eStatus.Open;
 4            RegistryKey sub = parent.OpenSubKey(name, true);
 5            if (sub == null)
 6            {
 7                sub = parent.CreateSubKey(name, RegistryKeyPermissionCheck.ReadWriteSubTree);
 8                status = eStatus.Create;
 9            }

10
11            return sub;
12        }

上面的一个方法是对注册表的存取。

 1          enum  eStatus
 2          {
 3            Open,
 4            Create
 5        }

 6
 7          public   static   void  AssocFileType()
 8          {
 9            RegistryKey lphKey = Registry.ClassesRoot;
10            string sKeyName, sKeyValue, sFileExt;
11            eStatus status;
12
13            sKeyName = "MCSF.File.1";
14            sKeyValue = "My CodeCreator Solution File";
15            sFileExt = ".mccsln";
16
17            RegistryKey sKey = OpenOrCreateSubKey(lphKey, sFileExt, out status);
18            if (status == eStatus.Create)
19            {
20                sKey.SetValue("", sKeyName);
21                sKey.SetValue("Content Type""application/mccsln");
22            }

23
24            sKey = OpenOrCreateSubKey(lphKey, sKeyName, out status);
25            if (status == eStatus.Create)
26            {
27                sKey.SetValue("", sKeyValue);
28                sKey.SetValue("BrowserFlags"8);
29                sKey.SetValue("EditFlags"0);
30            }

31
32            string path = Application.ExecutablePath + ",0";
33            RegistryKey icon = OpenOrCreateSubKey(sKey, "DefaultIcon"out status);
34            string regPath = icon.GetValue("""").ToString();
35            if (status == eStatus.Create)
36                icon.SetValue("", path);
37            else
38            {
39                if (!path.Equals(regPath))
40                    icon.SetValue("", path);
41            }

42            icon.Close();
43
44            sKey = OpenOrCreateSubKey(sKey, "shell"out status);
45            sKey = OpenOrCreateSubKey(sKey, "open"out status);
46            RegistryKey cmd = OpenOrCreateSubKey(sKey, "command"out status);
47            string cmdline = string.Format("\"{0}\" \"%1\"", Application.ExecutablePath);
48            string regCmdline = cmd.GetValue("""").ToString();
49            if (status == eStatus.Create)
50                cmd.SetValue("", cmdline);
51            else
52            {
53                if (!cmdline.Equals(regCmdline))
54                    cmd.SetValue("", cmdline);
55            }

56
57            RegistryKey dde = OpenOrCreateSubKey(sKey, "ddeexec"out status);
58            if (status == eStatus.Create)
59            {
60                OpenOrCreateSubKey(dde, "Application"out status).SetValue("""MyCodeCreator");
61                OpenOrCreateSubKey(dde, "Topic"out status).SetValue("""System");
62            }

63            dde.Close();
64
65            sKey.Flush();
66            sKey.Close();
67
68            lphKey.Close();
69        }


上面的代码意思很简单,无非就是照猫画虎而已。如果你需要套用上面的代码需要改动的地方不多,例如扩展名啊,可执行文件位置啊,图标等等。值得注意的事,当你执行完这些操作以后,关联不会马上生效,不知道什么原因,还望高手指教。

本文原发:无垠IT教学网

posted on 2006-10-03 14:43 嘻哈呵嘿 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/skyover/archive/2006/10/03/520564.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值