.NETCompactFramework下的注册表开发

简介

成都创新互联公司是一家专注于成都网站设计、成都网站制作与策划设计,播州网站建设哪家好?成都创新互联公司做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:播州等地区。播州做网站价格咨询:18982081108

本文讲述了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的菜单下找到。可以远程查看和修改注册表,非常方便。可是该工具不支持导入导出功能。

PHM Registry Editor

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

注册表开发的现实

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

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

  
  
  
  
  1. using Microsoft.Win32;

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

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

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

  
  
  
  
  1. public void Export(StringBuilder sb, RegistryKey key)
  2. {
  3. //log down itself.
  4. sb.AppendFormat(CultureInfo.CurrentCulture, "\r\n[{0}]\r\n", key.Name);
  5. //log down values
  6. string[] s = key.GetValueNames();
  7. Array.Sort(s);
  8. //log down "Default" first
  9. try
  10. {
  11. key.GetValue(Default);
  12. ExportValue(sb, key, Default);
  13. }
  14. catch
  15. {
  16. }
  17. foreach(string name in s)
  18. {
  19. if (!name.Equals(Default))
  20. {
  21. ExportValue(sb, key, name);
  22. }
  23. }
  24. //log down subkeys
  25. s = key.GetSubKeyNames();
  26. Array.Sort(s);
  27. foreach(string subKeyName in s)
  28. {
  29. Export(sb, key.OpenSubKey(subKeyName));
  30. }
  31. }

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

下面代码是导出Value。

  
  
  
  
  1. private void ExportValue(StringBuilder sb, RegistryKey key, string name)
  2. {
  3. switch (key.GetValueKind(name))
  4. {
  5. case RegistryValueKind.DWord:
  6. int dword = (int)key.GetValue(name);
  7. if (name.Equals(Default))
  8. {
  9. sb.AppendFormat(CultureInfo.CurrentCulture, "@=dword:{0:X8}\r\n", dword);
  10. }
  11. else
  12. {
  13. sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=dword:{1:X8}\r\n", name, dword);
  14. }
  15. break;
  16. case RegistryValueKind.String:
  17. if (name.Equals(Default))
  18. {
  19. sb.AppendFormat(CultureInfo.CurrentCulture, "@=\"{0}\"\r\n", key.GetValue(name));
  20. }
  21. else
  22. {
  23. sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=\"{1}\"\r\n", name, key.GetValue(name));
  24. }
  25. break;
  26. case RegistryValueKind.MultiString:
  27. string[] values = (string[])key.GetValue(name);
  28. if (name.Equals(Default))
  29. {
  30. sb.Append("@=multi_sz:");
  31. }
  32. else
  33. {
  34. sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=multi_sz:", name);
  35. }
  36. for (int i = 0; i < values.Length; i++)
  37. {
  38. if (i != 0)
  39. {
  40. sb.Append(",");
  41. }
  42. sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"", values[i]);
  43. }
  44. sb.Append("\r\n");
  45. break;
  46. case RegistryValueKind.Binary:
  47. byte[] bytes = (byte[])key.GetValue(name);
  48. if (name.Equals(Default))
  49. {
  50. sb.Append("@=hex:");
  51. }
  52. else
  53. {
  54. sb.AppendFormat(CultureInfo.CurrentCulture, "\"{0}\"=hex:", name);
  55. }
  56. int j = 0;
  57. for (int i = 0; i < bytes.Length; i++)
  58. {
  59. // Display each byte as two hexadecimal digits.
  60. if (i == (bytes.Length - 1))
  61. {
  62. sb.AppendFormat(CultureInfo.CurrentCulture, "{0:X2}", bytes[i]);
  63. }
  64. else
  65. {
  66. sb.AppendFormat(CultureInfo.CurrentCulture, "{0:X2},", bytes[i]);
  67. }
  68. ++j;
  69. if (j == 25)
  70. {
  71. j = 0;
  72. sb.Append("\\\r\n");
  73. }
  74. }
  75. sb.Append("\r\n");
  76. break;
  77. }
  78. }

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

下面是运行效果。

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

【编辑推荐】

  1. 浅谈.NET中不一样的多态
  2. ASP.NET开发程序过程中值得注意的两个地方
  3. 全面总结.NET 4.0新特性:C#和VB.NET的取长补短
  4. 深入理解Java多态性
  5. ASP.NET的错误处理机制

本文标题:.NETCompactFramework下的注册表开发
文章出自:http://www.zyruijie.cn/qtweb/news41/241.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联