Windows Mobile和Wince(Windows Embedded CE )下使用.NET Compact Framework下注册表导出工具的开发
2009-07-07 09:07
866 查看
简介
本文讲述了.NET Compact Framework下的注册表开发的基本概念,介绍在Windows Mobile和Wince下操作注册表的工具,同时使用C#实现了一个注册表导出工具。背景
Wince和Windows桌面系统一样都是把系统信息,驱动信息,应用程序信息等重要存放在注册表里面。最近需要实现3G设备的自动注册,3G链接项的自动创建功能。在实现该功能的过程中发现设备注册信息和链接项信息均保存在注册表里面,所以需要实现导出注册表功能,把注册前后的注册表信息进行比较。什么是注册表
注册表(Registry)其实就是一个层次型的文件数据库,用于保存操作系统信息,驱动信息,应用程序信息,用户信息等等。在注册表内有两个关键项,Key和Value,这里我保留英文,因为翻译成中文是键(key)和值(Value)比较容易混淆。所谓Key就是可以包含SubKey和Value的项。可以理解为一个容器节点,SubKey和Key在本质上是一样,SubKey可以继续包含SubKey和Value。Value就是包含数据类型,数据值的项,也可以理解为叶子节点,Value不能包含其他SubKey和Value。方案
查看和修改注册表,推荐使用以下两个工具:Windows CE Remote Registry Editor
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。
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时先导出其自身,然后导出Key下的所有Values,导出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。
程序运行效果
源代码:RegistryExporter.rar
环境:Visual Studio 2008 + Windows Mobile 6 professional SDK + .NET Compact Framework 2.0
相关文章推荐
- 在Windows Mobile和Wince(Windows Embedded CE)下如何使用.NET Compact Framework开发进程管理程序
- 在Windows Mobile和Wince(Windows Embedded CE)下如何使用.NET Compact Framework开发进程管理程序
- 在Windows Mobile和Wince(Windows Embedded CE)下使用.NET Compact Framework进行GPS NMEA data数据分析的开发
- 在Windows Mobile和Wince(Windows Embedded CE)下使用.NET Compact Framework进行GPS NMEA data数据分析的开发
- 在Windows Mobile和Wince(Windows Embedded CE)下使用.NET Compact Framework 取当前运行文件的路径
- Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)开发 之 Windows Embedded Source Tools for Bluetooth
- Windows Phone,Windows Mobile,Windows Embedded CE(WinCE),.NET Compact Framework,Native C++开发系列(上百篇原创文章不断更新完善中)
- Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)开发 之 Windows Embedded Source Tools for Bluetooth
- Windows Mobile和Wince(Windows Embedded CE)下如何封装Native DLL提供给.NET Compact Framework进行调用
- Windows Phone,Windows Mobile,Windows Embedded CE(WinCE),.NET Compact Framework,Native C++开发系列(上百篇原创文章不断更新完善中)【转】
- Windows Moible, Wince 使用.NET Compact Framework的进行蓝牙(Bluetooth)开发 之 Windows Embedded Source Tools for Bluetooth
- .NET Compact Framework下注册表导出工具的开发
- Windows Mobile, WinCe使用 .NET Compact Framework 进行3G和RAS应用的开发
- 开发Windows Mobile和Wince(Windows Embedded CE)的部署项目(Deploy Project)时,如何修改注册表
- Windows Mobile, WinCe使用 .NET Compact Framework 进行3G和RAS应用的开发
- .NET Compact Framework下注册表导出工具的开发
- Windows Mobile使用.NET Compact Framework开发Winform时如何Dispose资源
- 在Windows Mobile和Wince(Windows Embedded CE)下进行Native C++开发,如何取出资源文件中的版本信息
- Windows Mobile 和 Wince(Windows Embedded CE) 下的 WTL(Windows Template Library) 界面(UI)开发
- Useful Links for .NET Compact Framework & Windows CE & Windows Mobile