wince注册表操作

 
1)WinCE注册表
     注册表是一个系统数据库,保存操作系统配置信息和运作状态。结构基本相同:键名最大长度255个字符、数据最大4k、子键深度最大值16层。
    WinCE支持四个根键:
        HKEY_ CLASSES_ROOT,OLE和文件类型匹配配置数据;
        HKEY_ LOCAL_MACHINE,硬件和驱动配置数据;
        HKEY_CURRENT_USER,用户配置数据;
        HKEY_USERS,适用于所有用户的数据。
 
2、WinCE注册表的实现方式
1)基于RAM的注册表
     存放在内存中。如果系统断电,改动都会丢失。优点是读写访问操作非常高效。因此,适用于有电池只热启动的设备。
  2)基于Hive的注册表
     存放在文件上,分为几个文件:
        ①Boot Hive,一般只在启动时使用。
        ②System Hive,系统的数据。
        ③User Hive,HKEY_CURRENT_USER的数据,每个用户都有一个User.hv。
     基于Hive的注册表适用于有外存且经常冷启动的设备。Hive把系统数据和用户数据分开存放(单独的User.hv),这表示可以提供多用户支持。

3、 WinCE采用Hive的注册表。
  
使用API操作注册表

注册表结构:

根键——键(值名,类型【字符串、数值、二进制】,值)

 ◆ 创建一个键

HKEY hkey = NULL;  <BR>DWORD dwRet = 0;
if(ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE,"键名", 0, "",//类名
                                    REG_OPTION_NON_VOLATILE,//REG_OPTION_指明键永久保留
                                    KEY_READ|KEY_WRITE,    //KEY_访问模式
                                    NULL,        //安全结构默认                  
                                    &hKey, &dwRet//打开状态REG_OPENED_EXISTING_KEY \ CREATED_NEW_KEY
                                    )){
    //操作hKey
}

◆  打开一个键

HKEY hkey = NULL;   
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER,"键名", 0, KEY_ALL_ACCESS, &hkey))

◆  查询键值【UNICODE、主要类型】

注意:使用RegQueryValueEx时,有个窍门,如果想根据值的长度建立一个buffer(第三个参数)。可以调用两次RegQueryValueEx,第一次让第三个参数设为NULL,此时第四个参数就是值的长度,然后建立这个长度大小的buffer,再重新调用RegQueryValueEx即可。

DWORD dwtype = 0; 
DWORD dwlength = 0;         
long retcode = RegQueryValueEx(hkey, _T("键名"), 0, &dwtype, NULL, &dwlength);//类型、长度,内容为NULL
  
if(ERROR_SUCCESS == retcode)//成功获取长度和类型信息
{   
    if(REG_SZ == dwtype || REG_BINARY == dwtype)//字符串和二进制类型
    {
        byte* buf = NULL;
        buf =new byte[dwlength];
        memset(buf, 0, dwlength);
        RegQueryValueEx(hkey, _T("键名"), 0, &dwtype, buf, &dwlength);//内容
          
        if(REG_SZ == dwtype) 
            std::wcout<<(TCHAR*)buf;
        if(REG_BINARY == dwtype)
            std::wcout<<buf;
  
        delete[]buf;
    }
      
    if(REG_DWORD == dwtype)//数值类型
    {
        DWORDi = 0;             
        RegQueryValueEx(hkey, _T("键名"), 0, &dwtype, (LPBYTE)(&i), &dwlength); //内容              
        std::wcout<<i;
    }   
}

◆  设置键值

RegSetValueEx(hkey, _T("1"), 0, REG_SZ, (LPBYTE)_T("内容"), len));//字符串
  
DWORD dwn;
int ret = RegSetValueEx(hkey, _T("1"), 0, REG_DWORD, (LPBYTE)&dwn, 4);//数值
  
byte buf[N];
RegSetValueEx(hkey, _T("1"), 0, REG_BINARY, buf, 10);//二进制

◆  枚举键、值

  
  
TCHAR name[N];
memset(name, 0, N);
DWORD len1=N;
  
while ((ret = RegEnumKey(hkey,i,name,0))==0) {
    //TCHAR[] 不用反复memset,每次传字符串末尾会填0
    ++i;
}
//接收的空间不够,会返回错误码ret —— 注册表名最长255个字节
注意:RegEnumValue中有同时为in-out型的参数。查阅MSDN要留意参数类型和方式,对这类参数要注意可能要复位

  
  
DWORD dwtype = 0;
  
TCHAR name[N1];
memset(name, 0, N1);
DWORD len1 = N1;
  
byte value[N2];
memset(value, 0, N2);
DWORD len2 = N2;
  
int i = 0;
long ret = 0;
while ((ret = RegEnumValue(hkey, i, name, &len1, 0, &dwtype, value, &len2))==0)
{           
    //TCHAR[]不用反复memset,原因如前
    len1 = N1;
  
    //byte[]就要注意,如果实际是字符类型也无妨,如果是二进制码没有结束符,所以提供了len
    memset(value, 0, LEN2);     
    len2 = N2;
    ++i;
}//要注意len参数同时是in-out型,调用一次会改变下一次传入的len值,所以每次要复位为原来大小

◆  删除键、值

RegDeleteValue(hKey, "键值名");
RegDeleteKey(hKey, "键名");

◆  关闭

RegCloseKey(hKey);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值