C++中注册表操作

来源:互联网 发布:骂河南人被起诉 知乎 编辑:程序博客网 时间:2024/06/15 04:00

C++接触了一段时间,最近在捣鼓PatrolBot移动机器人小车,在看源码的时候发现有对注册表操作的代码,第一次接触,便来此记录一番。

首先把用到注册表操作的这个函数(ArUtil类的成员函数)搬上来,该函数功能是从注册表中获取一个字符串

AREXPORT bool ArUtil::getStringFromRegistry(REGKEY root,   const char *key,   const char *value,   char *str,   int len){#ifndef WIN32  return false;#else // WIN32  HKEY hkey;  int err;  unsigned long numKeys;  unsigned long longestKey;  unsigned long numValues;  unsigned long longestValue;  unsigned long longestDataLength;  char *valueName;  unsigned long valueLength;  unsigned long type;  char *data;  unsigned long dataLength;  HKEY rootKey;  switch (root)  {  case REGKEY_CLASSES_ROOT:    rootKey = HKEY_CLASSES_ROOT;    break;  case REGKEY_CURRENT_CONFIG:    rootKey = HKEY_CURRENT_CONFIG;    break;  case REGKEY_CURRENT_USER:    rootKey = HKEY_CURRENT_USER;    break;  case REGKEY_LOCAL_MACHINE:    rootKey = HKEY_LOCAL_MACHINE;    break;  case REGKEY_USERS:    rootKey=HKEY_USERS;    break;  default:    ArLog::log(ArLog::Terse,        "ArUtil::getStringFromRegistry: Bad root key given.");    return false;  }  /// 打开一个指定的注册表键  if ((err = RegOpenKeyEx(rootKey, key, 0, KEY_READ, &hkey)) == ERROR_SUCCESS)  {    //printf("Got a key\n");    if (RegQueryInfoKey(hkey, NULL, NULL, NULL, &numKeys, &longestKey, NULL, &numValues, &longestValue, &longestDataLength, NULL, NULL) == ERROR_SUCCESS)    {       data = new char[longestDataLength+2];      valueName = new char[longestValue+2];      for (unsigned long i = 0; i < numValues; ++i)      {dataLength = longestDataLength+1;valueLength = longestValue+1;if ((err = RegEnumValue(hkey, i, valueName, &valueLength, NULL, //用来枚举指定项的值。&type, (unsigned char *)data, &dataLength)) == ERROR_SUCCESS){//printf("Enumed value %d, name is %s, value is %s\n", i, valueName, data);  if (strcmp(value, valueName) == 0)  {    if (len < dataLength)    {      ArLog::log(ArLog::Terse,"ArUtil::getStringFromRegistry: str passed in not long enough for data.");      delete data;      delete valueName;      return false;    }    strncpy(str, data, len);    delete data;    delete valueName;    return true;  }}      }      delete data;      delete valueName;    }  }  return false;#endif}

其中,关于注册表操作的函数只要三个:

1. RegOpenKeyEx

2. RegQueryInfoKey

3. RegEnumValue

下面,我们逐一介绍这三个函数。


1. RegOpenKeyEx

WINADVAPI LSTATUS APIENTRY RegOpenKeyEx (HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult);

函数功能:打开一个指定的注册表键

参数hKey:需要打开的主键的名称,HKEY_CLASSES_ROOT / HKEY_CURRENT_CONFIG / HKEY_CURRENT_USER / HKEY_LOCAL_MACHINE / HKEY_USERS,这五个中的一个哦~

参数lpSubKey:需要打开的子键的名称

参数ulOptions:保留,设为0

参数samDesired:安全访问标记,也就是权限。主要用到的是KEY_READ。

参数phkResult:输出参数,保存将要打开键的句柄。

返回值:零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。


举例说明:


看到没有,主键只有这五种情况~

假如我想要主键HKEY_LOCAL_MACHINE下面的Aria子键,那么,

参数hKey要设为HKEY_LOCAL_MACHINE

参数lpSubKey要设为"SOFTWARE\\ActivMedia Robotics\\Aria"



2. RegQueryInfoKey

RegQueryInfoKey(HKEY hkey, //要获取信息的句柄LPWSTR lpClass, <span style="white-space:pre"></span>//接受创建健时的Class字符串LPDWORD lpcbClass, <span style="white-space:pre"></span>//lpClass的长度LPDWORD lpReserved, <span style="white-space:pre"></span>//系统保留,指定为0LPDWORD lpcSubKeys,<span style="white-space:pre"></span>//子键数量LPDWORD lpcbMaxSubKeyLen, //子键中最长名称的长度LPDWORD lpcbMaxClassLen, //子键中最长Class字符串长度LPDWORD lpcVlaues, //键值数量LPDWORD lpcbMaxValueNameLen, //键值项中最长名称的长度LPDWORD lpcbMaxValueLen, //键值项数据最大长度LPDWORD lpcbSecurityDescriptor, //安全描述符长度FILETIME lpftLastWriteTime, //FILETIME结构,最后修改时间);

函数功能:获取键的统计信息,查看将要读取的字符串长度是否小于键值数据的最大长度。

参数太多,下面只说明重要的参数吧~

参数hkey:指定要获取信息的键句柄,键的打开方式中必须包括KEY_QUERY_VALUE。

参数lpcSubKeys:指向一个双字,用来返回键中的子键数量

参数lpcbMaxSubKeyLen:指向一个双字,用来返回所有子键中最长的名称字符串长度,返回的长度不包括字符串结尾的0字符。

参数lpcVlaues:指向一个双字,用来返回键下面的键值项数量

参数lpcbMaxValueNameLen:指向一个双字,用来返回所有键值项中最长的名称字符串长度,返回的长度不包括字符串结尾的0字符。

参数lpcbMaxValueLen:指向一个双字,用来返回所有键值数据的最大长度

返回值:零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码。
如一个缓冲区的长度不够,不能容下返回的数据,则函数会返回ERROR_MORE_DATA


例子回头再举吧。。。


3. RegEnumValue

RegEnumValue(Long hkey, //被枚举的键句柄Long dwIndex, //子键索引编号String lpValueName, //键值名称Long lpcbValueName, //键值名称长度Long lpReserved, //系统保留,指定为0Long lpType, //键值数据类型Byte lpDate, //键值数据Long lpcbDate //键值数据长度);

函数功能:用来枚举指定项的值



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 3d下载模型没颜色怎么办 车辆被扣30分怎么办 驾驶证被扣15分怎么办 驾驶本被扣分了怎么办 违章扣分扣错了怎么办 出国自驾游怎么办手续 新加坡开车工作遇到坏人怎么办 身份证户口本都丢了怎么办 户口本和身份证都丢了怎么办 网上预约挂完号没收到短信怎么办 驾驶证过了换证期限怎么办 身体弱末梢神经循环不好怎么办 自来水钙镁离子超标怎么办 呼吸感觉有煤烟味是怎么办 酒精弄到衣服上怎么办 孕妇吃了糟卤怎么办 气泡机打不了气怎么办 膝盖好冷好凉怎么办吃什么好 卸妆水进眼睛了怎么办 外出没带卸妆水怎么办? 种睫毛卸睫膏弄眼睛里面了 怎么办 化了妆没卸妆水怎么办 痘痘变成了黑痣怎么办 痘痘形成的痣怎么办 图片文件重命名改不了怎么办 想给宝宝改名字怎么办 洗照片像素过低怎么办 用ps改尺寸照片变形怎么办 平安银行卡三次密码错误怎么办 平安银行卡密码忘了怎么办 平安银行行用卡多次还款怎么办 平安银行大润发卡还不上怎么办 八载图片被投诉怎么办 ps用替换颜色后怎么办 三星s8百度闪退怎么办 吃了过敏的东西怎么办 过敏了痒的厉害怎么办 脸吃麻辣过敏了怎么办 脸过敏发红痒怎么办急救 脸过敏怎么办快速治疗方法 下巴起噶的过敏怎么办