• .NET Compact Framework下注册表导出工具的开发


     http://www.cnblogs.com/procoder/archive/2009/07/07/1518092.html

    简介

    本文讲述了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

    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

  • 相关阅读:
    关于[一个基于WF的业务流程平台]表设计的说明
    这几年开发工作流的感受
    在Silverlight中绘制贝塞尔曲线
    WF工作流设计器(WPF版)
    基于WF设计业务流程平台_消息收集、通知接口
    基于WF设计业务流程平台_数据冲突
    NET4.0 CTP 中的WF
    NET 4,3,2,1其实什么也没有变
    基于WF设计业务流程平台_权限在流程模板外部映射
    无题
  • 原文地址:https://www.cnblogs.com/xyzlmn/p/3168466.html
Copyright © 2020-2023  润新知