1 说明
注册表编辑的函数有:打开,关闭,创建表项,
设定表项默认(无名)的值&&类型为REG_SZ(null结尾字符串)的数据
设定表项指定名称的值&&任意类型的数据
2 创建
LONG RegCreateKey(
HKEY hKey, // 注册表中的根目录, 例如HKEY_LOCAL_MACHINE。 handle to an open key
LPCTSTR lpS Key,// 子目录以及表项名称,例如software\myProfile。 s key name
PHKEY phkResult// HEKY类型指针,以后用该指针标识该表项。 b?r for key handle
);
eg.
HKEY hKey;
RegCreateKey(HKEY_LOCAL_MACHINE, "software\\myProfile", &hKey); //注意这里是两条斜杠
3 打开
这个函数有点类似RegCreateKey()函数。
LONG RegOpenKey(
HKEY hKey, // 例如HKEY_LOCAL_MACHINE。handle to open key
LPCTSTR lpS Key, //子目录以及表项名称,例如software\myProfile。 name of s key to open
PHKEY phkResult// HEKY类型指针,以后用该指针标识该表项。handle to open key
);
eg.
HKEY hKey;
RegOpenKey(HKEY_LOCAL_MACHINE, "software\\myProfile", &hKey);
4 关闭
LONG RegCloseKey(
HKEY hKey// RegCreateKey 或 RegOpenKey 执行后的hKey。 handle to key to close
);
eg.
RegCloseKey(hKey);
5 设定 表项默认(无名)的值&&类型为REG_SZ(null结尾字符串)的数据
LONG RegSetVal(
HKEY hKey,//如果是刚创建或已打开则用已有的句柄hKey,第二个参数为NULL。 或者像创建或打开那样为前两个参数赋值。
// handle to key
LPCTSTR lpS Key,// 根据第一个参数决定,如果为hKey则它为NULL,否则为子目录加表项。 s key name
DWORD dwType,// 必须为REG_SZ. information type
LPCTSTR lpData,//要写入的字符的指针 val data
DWORD cbData//要写入的字节数,不包括'\0'。 size of val data
);
eg.
①已经打开或刚创建的表项
RegSetVal(hKey, NULL, REG_SZ, "cuihaohao", (strlen("cuihaohao") ) * sizesof(char) );
②未打开而已存在的表项
RegSetVal(HKEY_LOCAL_MACHINE, "software\\url", REG_SZ, "www.baidu.com", strlen("www.baidu.com") * sizeof(char));
6 读取 默认(无名)的值&&类型为REG_SZ(null结尾字符串)的数据
LONG RegQryVal(
HKEY hKey,//如果是刚创建或已打开则用已有的句柄hKey,第二个参数为NULL。 或者像创建或打开那样为前两个参数赋值。
// handle to key to qry
LPCTSTR lpS Key,//根据第一个参数决定,如果为hKey则它为NULL,否则为子目录加表项。 s key name
LPTSTR lpVal,// 要读入的缓冲区。 string b?r
PLONG lpcbVal// 读到或要读到的字符串大小,包含'\0'。 size of returned string
);
NOTE: 如果lpVal为NULL,则lpcbVal也可以返回要读入的字符串大小,因此一般调用两次该函数,第一次lpVal为NULL,取得lpcbVal的值,然后为lpVal开辟一个大小正合适的内存空间,否则要为为lpVal开辟尽量大的空间,当空间不够时,lpcbVal返回需要的大小。 即:要么调用两次该函数获得正合适大小的空间,要么调用一次而给lpVal分配足够大的空间。
eg.
假设已经有打开或新建了的表项句柄hKey
char *ch = NULL;
LONG valLength = 0;
RegQryVal(hKey, NULL, NULL, &valLength); //返回的valLength的值为包含'\0'的字节数
ch = new char[ valLength / sizesof(char) ]; // 总字节数/单个字符字节 == 字符个数
RegQryVal(hKey,NULL, ch, &valLength);
MessageBox(ch);// 弹出读到的值
RegCloseKey(hKey);
delete ch; //释放ch指向的内存空间
ch = NULL; //避免野指针
7 设定 表项指定名称的值&&任意类型的数据
LONG RegSetValEx(
HKEY hKey,// 已打开或刚新建的表项句柄 hKey。 handle to key
LPCTSTR lpValName,// 值名 val name
DWORD Reserved,// 保留 , 必须为0. reserved
DWORD dwType,// 值类型 val type
CONST BYTE* lpData,// 和值类型相关的数据 val data
DWORD cbData// lpData所指向缓冲区的大小,字节,如果值类型是 REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ(字符串类型)该大小包含结尾的'\0'。
);
eg.
HKEY hKey;
DWORD dwAge = 26;
char *name = "cuihao";
RegOpenKey(HKEY_LOCAL_MACHINE, "software\\myProfile", &hKey);
RegSetValEx(hKey, "age", 0, REG_DWORD /*整形*/, (CONST BYTE*)&dwAge, sizeof(dwAge) );
RegSetValEx(hKey, "name", 0, REG_SZ, (CONST BYTE*)name, (strlen(name) + 1) * sizeof(char) ); // "str(name) + 1"是加 //上末尾的'\0'
RegCloseKey(hKey);
8 读取 表项指定名称的值&&指定类型的数据
LONG RegQryValEx(
HKEY hKey,//如果是刚创建或已打开则用已有的句柄hKey。 handle to key
LPCTSTR lpValName,//值名 val name
LPDWORD lpReserved,// 保留,必须为0. reserved
LPDWORD lpType,//[out],返回读入的值的类型。 type b?r
LPBYTE lpData,// 读入的内容写入该缓冲区,缓冲区的类型要根据值类型不同而不同。 data b?r
LPDWORD lpcbData//[in / out] 读入的内容的大小,字节,如果是 REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ(字符串类型) 该大小包含结尾的'\0'。size of data b?r
);
NOTE:和RegQryVal()类似,如果lpData为NULL,而lpcbData不为空,则lpcbData返回字节单位的读到的内容的大小。
如果lpData空间不够大,会返回一个ERROR_S?SS错误,同时lpcbData返回需要的空间大小。 所以,要么调用两次以获得正合适大小的空间;要么调用一次该函数,前提是分配足够大的空间。
当lpValName为NULL或者空字符串("")时,读的是默认(无名)的值的数据。
eg.
①读默认(无名)的值的数据
//读默认值//
DWORD defaultType = 0;
char *defaultData = new char[20]; //假设20足够大
memset(defaultData, 0, 20);
DWORD defaultLength = 20;
::RegQryValEx(hKey, NULL, 0, &defaultType, (LPBYTE)defaultData, &defaultLength);
MessageBox(defaultData);
RegCloseKey(hKey);
delete defaultData;
defaultData = NULL;
②读取指定值名的数据
HKEY hKey;
::RegOpenKey(HKEY_LOCAL_MACHINE, "software\\myProfile", &hKey);
///读年龄
DWORD dwType = 0;
DWORD data = 0;
DWORD cbData = sizeof(DWORD);
::RegQryValEx(hKey, "age", 0, &dwType, (LPBYTE)&data, &cbData);
CString str;
str.Format("age=%d", data);
//MessageBox(str);
读名字//
char *nameB?r = NULL;
DWORD nameType = 0;
DWORD nameLength = 0;
::RegQryValEx(hKey, "name", 0, &nameType, NULL, &nameLength); //先得到nameLength的合适大小,单位字节,从而 // 为nameB?r分配合适大小空间
nameB?r = new char[nameLength / sizeof(char)];
::RegQryValEx(hKey, "name", 0, &nameType, (LPBYTE)nameB?r, &nameLength);
//MessageBox(nameB?r);
//清理
RegCloseKey(hKey);
delete nameB?r;
nameB?r = NULL;
?