我们对注册表的操作一般的步骤是,打开、读写、关闭,那就先来看看相关最重要的几个函数介绍吧,其它更多的函数还得靠大家去MSDN查阅。
首先来看看,打开与关闭函数,在读写注册表前,必须先将目标的子键打开,也就是取得一个操作的句柄,而打开这个函数最常用的就是RegCreateKeyEx,如果没有这个键存在,那么就会自动的创建这个子键项。
LONG RegCreateKeyEx(
HKEY hKey, //父键的句柄
LPCTSTR lpSubKey, //子键名称
DWORD Reserved, //一般为0
LPTSTR lpClass, //一般为0
DWORD dwOptions, //创建子键时的选项
REGSAM samDesired, //打开方式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指定继承性
PHKEY phkResult, //用于返回子键的句柄
LPDWORD lpdwDisposition //打开还是创建子键的信息
);
如果函数调用成功,会返回ERROR_SUCCESS也就是说成功会返回0,失败返回非0值。
SamDesired参数有多个取值,最后这个lpdwDisposition参数用于返回信息,有两个取值:
REG_CREATED_NEW_KEY 指定的键不存在,那么创建。
REG_OPENED_EXISTING_KEY 指定的键存在,那么打开。另外还有相近的函数如下:
LONG RegOpenKeyEx(
HKEY hKey, // 要打开主键的句柄
LPCTSTR lpSubKey, //要打开子键
DWORD ulOptions, //保留
REGSAM samDesired, //安全存取参数
PHKEY phkResult //打开键句柄的地址
);
与打开函数相比,关闭就比较容易了,它的函数原型如下:
LONG RegCloseKey( HKEY hKey);所以只需传入一个要关闭的句柄就行了。
然后,我们来看看读写的相关函数,读取的函数原型如下:
LONG RegQueryValueEx(
HKEY hKey, //子键句柄
LPCTSTR lpValueName, //键值名称
LPDWORD lpReserved, //为0
LPDWORD lpType, //返回键值的数据类型
LPBYTE lpData, //返回键值的数据
LPDWORD lpcbData //缓冲区的大小
);
函数调用成功后,返回ERROR_SUCCESS.
例如用regedit 查到KEY_LOCAL_MACHINE中存在GUESTTOOLS 我们可以通过以上API来获取其值及属性
int GetGuestToolsFilePath( char * filename, char * path)
{
LONG lRet;
HKEY hKey;
DWORD dwBuflen = RGE_PATH_LENGTH;
char regpath[RGE_PATH_LENGTH] = {0};
char toolspath[RGE_PATH_LENGTH] = {0};
if ( NULL == path )
{
printf("The path in GetGuestToolsFilePath is Error");
return -1;
}
if(Is64BitSystem()){
if(RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SOFTWARE\\Wow6432Node\\GUEST TOOLS",0,KEY_QUERY_VALUE,&hKey)!= ERROR_SUCCESS)
{
printf("##Open the Reg Get WhiteList Path Error##");
return -1;
}
}else{
if(RegOpenKeyExA(HKEY_LOCAL_MACHINE,"SOFTWARE\\GUEST TOOLS",0,KEY_QUERY_VALUE,&hKey)!= ERROR_SUCCESS)
{
printf("##Open the Reg Get WhiteList Path Error##");
return -1;
}
}
lRet = RegQueryValueExA(hKey,"InstallPath",NULL,NULL,(LPBYTE)regpath,&dwBuflen);
if(lRet != ERROR_SUCCESS)
{
printf("##Failed to get the Reg Value From:%s and error:%lu", toolspath, GetLastError());
return -1;
}
RegCloseKey(hKey);
if ('\0' == regpath[0] || RGE_PATH_LENGTH <= strlen(regpath))
{
printf("The regpath is Error!!");
return -1;
}
strcpy(path,regpath);
if ( NULL != filename &&
(IFLE_PATH_LENGTH - RGE_PATH_LENGTH) > strlen(filename))
{
strcat(path,filename);
}
printf("##Get IP Config File Path Success path:%s ##",path);
return 0;
}