600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Windows Mobile和Wince(Windows Embedded CE )下使用.NET Compact Framework下注册表导出工具的开发...

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

时间:2024-08-05 22:33:27

相关推荐

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

PHM Registry Editor

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

现实

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

操作注册表类是在 2.0引入的, 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 + Windows Mobile 6 professional SDK + .NET Compact Framework 2.0

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。