.NET Compact Framework下的注册表开发

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

Windows CE Remote Registry Editor

PHM Registry Editor

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

PHM Registry Editor

注册表开发的现实

由于上述两个工具的局限性,所以我实现了一个注册表导出功能,和桌面版的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的错误处理机制
责任编辑:杨鹏飞 来源: cnblogs
相关推荐

2011-04-21 09:10:16

2009-06-18 10:41:03

RuntimeVers.NET组件

2010-01-06 18:47:21

.NET Compac

2009-10-12 16:08:14

VB.NET访问注册表

2009-10-16 09:40:54

VB.NET访问注册表

2010-01-11 18:40:03

VB.NET操作注册表

2011-08-04 16:37:09

注册表编辑器注册表

2011-09-16 14:22:31

注册表windowsVist

2011-08-03 18:01:40

注册表

2010-01-08 10:09:50

VB.NET注册表操作

2009-11-10 17:31:38

VB.NET注册表

2009-10-26 14:50:18

VB.NET遍历注册表

2010-01-18 13:57:38

VB.NET读写注册表

2009-10-26 13:46:31

VB.NET注册表权限

2009-08-21 09:43:49

C#编辑注册表

2011-08-04 16:49:33

注册表注册表编辑器

2021-02-18 14:40:38

网络安全注册表代码

2011-03-17 11:24:15

2010-10-20 17:14:03

SQL Server管

2011-08-04 11:11:59

点赞
收藏

51CTO技术栈公众号