温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

.NET Compact Framework下的注册表怎么开发

发布时间:2021-10-28 09:43:40 来源:亿速云 阅读:135 作者:柒染 栏目:编程语言

.NET Compact Framework下的注册表怎么开发,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

简介

讲述CF.net下的注册表开发的基本概念,介绍在Windows Mobile和Wince下操作注册表的工具,同时使用C#实现了一个注册表导出工具。

背景

Wince和Windows桌面系统一样都是把系统信息,驱动信息,应用程序信息等重要存放在注册表里面。最近需要实现3G设备的自动注册,3G链接项的自动创建功能。在实现该功能的过程中发现设备注册信息和链接项信息均保存在注册表里面,所以需要实现导出注册表功能,把注册前后的注册表信息进行比较。

什么是注册表

注册表(Registry)其实就是一个层次型的文件数据库,用于保存操作系统信息,驱动信息,应用程序信息,用户信息等等。在注册表内有两个关键项,Key和Value,这里我保留英文,因为翻译成中文是键(key)和值(Value)比较容易混淆。所谓Key就是可以包含SubKeyValue的项。可以理解为一个容器节点,SubKey和Key在本质上是一样,SubKey可以继续包含SubKey和Value。Value就是包含数据类型数据值的项,也可以理解为叶子节点,Value不能包含其他SubKeyValue

注册表开发方案

查看和修改注册表,推荐使用以下两个工具:

Windows CE Remote Registry Editor,可以在VS 2005和VS 2008的菜单下找到。可以远程查看和修改注册表,非常方便。可是该工具不支持导入导出功能。

.NET Compact Framework下的注册表怎么开发

PHM Registry Editor

该工具可以安装在设备上,在设备上直接查看和修改注册表。PHM Registry Editor同时支持导入导出功能,可是导入导出是使用私有格式,和MS的不兼容。

.NET Compact Framework下的注册表怎么开发

注册表开发的现实

由于上述两个工具的局限性,所以我实现了一个注册表导出功能,和桌面版的Registry Editor导出功能的文件格式兼容。

操作注册表类是在CF.net 2.0引入的,CF.net 1.0不支持。使用注册表功能,需要引用Microsoft.Win32 namespace。

using Microsoft.Win32;

下面是导出接口,把根下所以key导出到StringBuilder中。

public StringBuilder Export()  {  StringBuilder sb = new StringBuilder();  Export(sb, Registry.ClassesRoot);  Export(sb, Registry.CurrentUser);  Export(sb, Registry.LocalMachine);  Export(sb, Registry.Users);  return sb;  }
 
在Windows Mobile和Wince系统下注册表的项比桌面系统少一些,如上图可见。

下面的代码是导出具体的一个key。

 public void Export(StringBuilder sb, RegistryKey key)  {      //log down itself.      sb.AppendFormat(CultureInfo.CurrentCulture, "\r\n[{0}]\r\n", key.Name);       //log down values      string[] s = key.GetValueNames();      Array.Sort(s);            //log down "Default" first      try      {          key.GetValue(Default);          ExportValue(sb, key, Default);      }      catch      {      }      foreach(string name in s)      {          if (!name.Equals(Default))          {  ExportValue(sb, key, name);          }      }       //log down subkeys      s = key.GetSubKeyNames();      Array.Sort(s);      foreach(string subKeyName in s)      {          Export(sb, key.OpenSubKey(subKeyName));      }  }

导出Key是先导出自身,然后导出Value,导出Value时如果有Default Value的话先导出Default Value,然后导出其他Value。导出Value后再递归导出SubKeys。

下面代码是导出Value。

private void ExportValue(StringBuilder sb, RegistryKey key, string name)         {             switch (key.GetValueKind(name))             {                 case RegistryValueKind.DWord:                     int dword = (int)key.GetValue(name);                     if (name.Equals(Default))                     {                         sb.AppendFormat(CultureInfo.CurrentCulture, "@=dword:{0:X8}\r\n", dword);                     }                     else                     {                         sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=dword:{1:X8}\r\n", name, dword);                     }                     break;                 case RegistryValueKind.String:                     if (name.Equals(Default))                     {                         sb.AppendFormat(CultureInfo.CurrentCulture, "@=\"{0}\"\r\n", key.GetValue(name));                     }                     else                     {                         sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=\"{1}\"\r\n", name, key.GetValue(name));                     }                      break;                 case RegistryValueKind.MultiString:                     string[] values = (string[])key.GetValue(name);                     if (name.Equals(Default))                     {                         sb.Append("@=multi_sz:");                     }                     else                     {                         sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=multi_sz:", name);                     }                       for (int i = 0; i < values.Length; i++)                     {                         if (i != 0)                         {                             sb.Append(",");                         }                         sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"", values[i]);                     }                     sb.Append("\r\n");                     break;                 case RegistryValueKind.Binary:                     byte[] bytes = (byte[])key.GetValue(name);                     if (name.Equals(Default))                     {                         sb.Append("@=hex:");                     }                     else                     {                         sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=hex:", name);                     }                      int j = 0;                     for (int i = 0; i < bytes.Length; i++)                     {                         // Display each byte as two hexadecimal digits.                         if (i == (bytes.Length - 1))                         {                             sb.AppendFormat(CultureInfo.CurrentCulture, "{0:X2}", bytes[i]);                         }                         else                         {                             sb.AppendFormat(CultureInfo.CurrentCulture, "{0:X2},", bytes[i]);                         }                          ++j;                         if (j == 25)                         {                             j = 0;                             sb.Append("\\\r\n");                         }                     }                     sb.Append("\r\n");                     break;             }         }

由于Value有不同的数据类型,导出的时候根据数据类型来导出不同的格式。key.GetValueKind()函数可以取出Key数据类型RegistryValueKind。

下面是运行效果。

.NET Compact Framework下的注册表怎么开发

环境:Visual Studio 2008 + Windows Mobile 6 professional SDK + .NET Compact Framework 2.0

关于.NET Compact Framework下的注册表怎么开发问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI