65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 应用程序的 PocketPC 注册表

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.94/5 (8投票s)

2007年5月31日

CPOL

2分钟阅读

viewsIcon

50510

downloadIcon

498

用于处理 PocketPC 注册表的库

Pocket Registry Edit

引言

注册表是 Windows 操作系统中存储键值对的系统数据库。Windows CE 系统注册表以分层(树形)结构组织。它用于存储操作系统、应用程序和硬件设备的配置信息。此外,注册表还包含有关已安装的应用程序、驱动程序和可用硬件的信息。Pocket PC 注册表与桌面 Windows 注册表非常相似。您可以使用 regedit 工具查看桌面 PC 的结构。

背景

Pocket PC 注册表有四个主要的根节点和几个附加节点

  • HKEY_CLASSES_ROOT
  • HKEY_CURRENT_USER
  • HKEY_LOCAL_MACHINE
  • HKEY_USERS
  • HKEY_PERFORMANCE_DATA
  • HKEY_PERFORMANCE_TEXT
  • HKEY_PERFORMANCE_NLSTEXT
  • HKEY_CURRENT_CONFIG
  • HKEY_DYN_DATA

用于处理 Pocket PC 注册表的函数,例如打开根节点、创建键和值、删除节点、枚举子项,包含在 coredll.dll 系统库中。这组函数是 WinAPI 的一部分。

MSDN 注释
Windows API 是 Windows 操作系统的一部分的动态链接库 (DLL)。当编写等效过程有困难时,您可以使用它们来执行任务。

为了在文章中使用 PocketPC 注册表 API,我们将考虑 DllImport 属性

MSDN 注释
DllImport 属性提供了一种在没有类型库的情况下调用 DLL 中函数的方法。DllImport 大致等同于使用 Declare 语句,但提供了对函数调用方式的更多控制。

Using the Code

该库包含一个名为 CERegister 的单个类,其中包含用于从注册表中设置和获取字符串值的函数

  • RegGetStringValue
  • RegSetStringValue

它们用法的示例

 PocketRegistry.CERegister.RegSetStringValue(PitReg.RegRoot.HKEY_CURRENT_USER,
    "pocketpc\\CERegistry", "StringValue", "123");

这里还有一些 DllImport 属性用法的简要示例

创建注册表键

//
// RegCreateKeyEx 
//

[System.Runtime.InteropServices.DllImport("coredll.dll")]
        private static extern int RegCreateKeyEx(
            uint hKey, 
            string lpSubKey, 
            uint Reserved, 
            string lpClass, 
            uint dwOptions, 
            uint samDesired, 
            uint lpSecurityAttributes, 
            ref uint phkResult, 
            ref uint lpdwDisposition 
            );

打开注册表键

//
// RegOpenKeyEx 
//
System.Runtime.InteropServices.DllImport("coredll.dll")]
        private static extern int RegOpenKeyEx( 
            uint hKey, 
            string lpSubKey, 
            uint ulOptions, 
            uint samDesired, 
            ref uint phkResult 
            );

查询注册表值

//
// RegQueryValueEx
//

[System.Runtime.InteropServices.DllImport("coredll.dll")]
        private unsafe static extern int RegQueryValueEx( 
            uint hKey, 
            string lpValueName, 
            uint lpReserved, 
            out uint lpType, 
            byte * lpData, 
            ref uint lpcbData 
            );

获取字符串值有一个技巧。您应该首先检索值的长度,然后检索缓冲区中的值

private static string GetStringValue(uint Key, string Name)
        {    
            uint buflen = 0;
            uint type = 0;
            char []str = null;
            unsafe
            {    
                                //Get the length of the value:
                int r = RegQueryValueEx(Key,Name,0,out type,null,ref buflen);
                if (type!=(uint)RegType.REG_SZ) throw new Exception (
                    "The key is not of string value");

                                //Create a buffer for the value:
                byte[] rez_buf = new byte [buflen];

                                //Retrieve the value to the buffer
                fixed(byte *charpointer=&rez_buf[0])
                {
                    int rez = RegQueryValueEx(Key,Name,0,out type,charpointer,ref buflen);
                    if (rez != 0) throw new Exception ("Can't get value");
                }

                str = new char [buflen];
                for (int i=0; i<buflen; i++)
                    str[i] = (char)rez_buf[i];

            }    
            return new string (str);
        }

更多信息

有关更多信息,您可以参考 MSDN

历史

  • 提交于 2007 年 5 月 31 日
© . All rights reserved.