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