Windows Mobile和Wince(Windows Embedded CE )下使用.NET Compact Framework下注册表导出工具的开发

简介:
+关注继续查看

简介

本文讲述了.NET Compact Framework下的注册表开发的基本概念,介绍在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

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

registry1

 

PHM Registry Editor

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

registry2

 

现实

由于上述两个工具的局限性,所以我实现了一个注册表导出功能,和桌面版的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;
}

registry3

在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

程序运行效果

registry4

源代码:RegistryExporter.rar

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



    本文转自Jake Lin博客园博客,原文链接:http://www.cnblogs.com/procoder/archive/2009/07/07/Windows_Mobile_Registry.html,如需转载请自行联系原作者



相关文章
|
5天前
|
开发框架 C#
.NET开源的小巧、美观的桌面快速启动工具
.NET开源的小巧、美观的桌面快速启动工具
|
5天前
|
存储 C# 数据库
.NET开源的在Windows上统计软件使用时长和网站浏览时长工具 - Tai
.NET开源的在Windows上统计软件使用时长和网站浏览时长工具 - Tai
|
7月前
|
NoSQL Redis 数据安全/隐私保护
.net core工具组件系列之Redis—— 第一篇:Windows环境配置Redis(5.x以上版本)以及部署为Windows服务
Cygwin工具编译Redis Redis6.x版本是未编译版本(官方很调皮,所以没办法,咱只好帮他们编译一下了),所以咱们先下载一个Cygwin,用它来对Redis进行编译。
108 0
.net core工具组件系列之Redis—— 第一篇:Windows环境配置Redis(5.x以上版本)以及部署为Windows服务
|
7月前
|
API
.net core工具组件系列之Autofac—— 第二篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入
本篇文章接前一篇,建议可以先看前篇文章,再看本文,会有更好的效果。前一篇跳转链接:https://www.cnblogs.com/weskynet/p/15046999.html
284 0
.net core工具组件系列之Autofac—— 第二篇:Autofac的3种依赖注入方式(构造函数注入、属性注入和方法注入),以及在过滤器里面实现依赖注入
|
7月前
|
关系型数据库 MySQL 数据库连接
阿里云rds数据库导出到windows本地数据库中
在搜索框中输入MySQL,然后选中RDS版,进入控制台前首先要关闭数据库连接,否则找不到实例。
323 0
阿里云rds数据库导出到windows本地数据库中
|
7月前
|
数据处理 Windows
[Windows] 微信超级管家,自动好友回复、计数、自动同意、群发、好友导出、消息日志、无限多开
微信超级管家是一款大神针对微信制作的工具,它的主要功能包括了自动回复、好友计数、自动同意、群发、好友导出、消息日志、无限多开等等,让你拥有无限潜力哈,经常使用微信电脑版的朋友一定会用的上。
[Windows] 微信超级管家,自动好友回复、计数、自动同意、群发、好友导出、消息日志、无限多开
相关产品
云迁移中心
推荐文章
更多