WinCE注册表操作API

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;  
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);

posted on 2011-02-18 18:02  cvbnm  阅读(3848)  评论(0)    收藏  举报

导航