转载原址:http://www.yulemao.com/1/blogdetail!3753.aspx
EVC和VC下对注册表操作的方法有一些区别,
在VC下对注册表的写操作方法步骤如下:
先用RegCreateKey创建注册表项,然后RegSetValue或者RegSetValueEx函数对注册表的值进行写入;孙鑫老师写的代码如下:
HKEY hKey;
DWORD dwAge=30;
RegCreateKey(HKEY_LOCAL_MACHINE,"Software//http://www.sunxin.org//admin",&hKey);
RegSetValue(hKey,NULL,REG_SZ,"zhangsan",strlen("zhangsan"));
RegSetValueEx(hKey,"age",0,REG_DWORD,(CONST BYTE*)&dwAge,4);
RegCloseKey(hKey);
这里需要说明的是用RegSetValue函数只能写入类型为REG_SZ的项值,而用RegSetValueEx函数,就可以写任意类型的项值;RegSetValueEx函数中,最后一个传入参数,我个人认为应该用sizeof(DWORD)来代替比较好点。
在VC下对注册表的读写操作方法步骤如下:
一种方法是用RegQueryValue函数直接读取注册表项;孙鑫老师写的代码如下:
LONG lValue;
RegQueryValue(HKEY_LOCAL_MACHINE,"Software//http://www.sunxin.org//admin",
NULL,&lValue);
char *pBuf=new char[lValue];
RegQueryValue(HKEY_LOCAL_MACHINE,"Software//http://www.sunxin.org//admin",
pBuf,&lValue);
MessageBox(pBuf);
另一种方法是写用RegOpenKey函数打开注册表,然后再用RegQueryValueEx函数读取注册表信息;孙鑫老师写的代码如下:
HKEY hKey;
RegOpenKey(HKEY_LOCAL_MACHINE,"Software//http://www.sunxin.org//admin",&hKey);
DWORD dwType;
DWORD dwValue;
DWORD dwAge;
RegQueryValueEx(hKey,"age",0,&dwType,(LPBYTE)&dwAge,&dwValue);
CString str;
str.Format("age=%d",dwAge);
MessageBox(str);
同样,这里的RegQueryValue函数与RegQueryValueEx函数的区别也是项值类型的限制与否,跟写注册表的时候是一样的。
在EVC中,对于注册表的操作只有RegCreateKeyEx、RegSetValueEx、RegOpenKeyEx、 RegQueryValueEx这类函数,这些函数的参数也比较多,而且在EVC下由于是Unicode编程,所以在一些字符参数中要考虑到这点才行;
下面是EVC中,对注册表写操作的方法步骤:
用RegCreateKeyEx创建注册表项,然后用RegSetValueEx函数对注册表的值进行写入;下面是我写的一段代码:
HKEY hKey;
DWORD dwDisp;
RegCreateKeyEx(HKEY_LOCAL_MACHINE,L"Software//http://www.sunxin.org//admin",0,
NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,&dwDisp);
//================================
//================================
TCHAR name[9]=L"zhangsan";
DWORD sz_name;
sz_name = 1+lstrlen(name);
RegSetValueEx(hKey,NULL,0,REG_SZ,(LPBYTE)name,sizeof(TCHAR)*sz_name);
//================================
//================================
DWORD dwAge=30;
RegSetValueEx(hKey,L"age",0,REG_DWORD,(CONST BYTE*)&dwAge,sizeof(DWORD));
RegCloseKey(hKey);//关闭句柄
简要说明:
RegCreateKeyEx 函数的参数一共有9个参数,其中有不少参数与RegCreateKey函数的相同,第3~8个参数在这里好像没什么太大关系,设置成0与NULL对操作没有什么影响;最后一个参数,是一个输出参数,我也不大明白它的作用,只要定义个变量,然后让它输出就是了。
RegSetValueEx这个函数统一对注册表进行写操作,这里要说明的是在写类型为REG_SZ的项值时,最后一个参数长度,这里为什么要先加1,然后又要乘于一个sizeof (TCHAR),我不是很明白,应该是跟lstrlen函数有关吧。我也是参考其他代码写的。对于写类型为REG_DWORD的项值时,最后一个参数就用 sizeof(DWORD),测试可以正常工作。
对注册表读操作的方法步骤:
先用RegOpenKeyEx打开注册表,得到句柄,然后用该句柄使用RegQueryValueEx函数来读取相关的注册表信息;其中,在读类型为REG_SZ的值时,需要先获取下值的长度,然后再根据返回的长度创建缓冲区,最后再来读取值到缓冲区;
//打开注册表句柄
HKEY hKey;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,L"Software//http://www.sunxin.org//admin",0,0,&hKey);
DWORD lLength;//值的长度
DWORD lType;//值的类型
RegQueryValueEx(hKey,NULL,0,&lType,NULL,&lLength);
lLength *= sizeof(TCHAR);
TCHAR *pBuf=new TCHAR[lLength];//返回值缓冲区
RegQueryValueEx(hKey,NULL,0,&lType,(LPBYTE)pBuf,&lLength);
MessageBox(pBuf);
DWORD dwAge;//返回值
RegQueryValueEx(hKey,L"age",0,&lType,(LPBYTE)&dwAge,&lLength);
CString str;
str.Format(L"age=%d",dwAge);
MessageBox(str);
//===================================================
//===================================================
//===================================================
最后,想要说的是,可以将EVC对注册表读取的方法封装一下,这样就可以比较简单地使用。在下篇文章中详细讲述这种方法。