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; <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) //数值类型 |
{ |
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); |