Windows 获取注册表属性

我们对注册表的操作一般的步骤是,打开、读写、关闭,那就先来看看相关最重要的几个函数介绍吧,其它更多的函数还得靠大家去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)
     {
         //LOG_DEBUG("Failed to get the Reg Value!!");
         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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值