1.打开已经存在的键:
LONG RegOpenKeyEx(
HKEY hKey, // 需要打开的主键的名称
LPCTSTR lpSubKey, //需要打开的子键的名称
DWORD ulOptions, // 保留,设为0
REGSAM samDesired, // 安全访问标记,也就是权限
PHKEY phkResult // 得到的将要打开键的句柄
);
参数意义:
hKey [输入] 当前打开或者以下预定义的键。 lpSubKey [输入] 指向一个非中断字符串包含将要打开键的名称。如果参数设置为NULL 或者指向一个空字符串,过程将打开一个新的句柄由hKey参数确定的值。这种情况下,过程不会关闭先前已经打开的句柄。 ulOptions 保留,必须设置为 0samDesired [输入] 对指定键希望得到的访问权限的访问标记。phkResult [输出] 指向一个被打开键返回的句柄的指针。当不再需要句柄,必须调用 RegCloseKey 关闭它。返回值: 如果过程执行成功,返回值是 ERROR_SUCCESS。 如果功能失败,返回一个非零值,错误码在 Winerror.h 定义。可以使用 FormatMessage 函数 和 FORMAT_MESSAGE_FROM_SYSTEM 标记获得一个分类的错误描述。
2.创建新的键:
LONG WINAPI RegCreateKey(
__in HKEY hKey,
__in_opt LPCTSTR lpSubKey,
__out PHKEY phkResult
);
参数意义参考RegOpenKeyEx 。
3.获取和设置键值:
LONG WINAPI RegGetValue( //从注册表中取出一个值
__in HKEY hkey,
__in_opt LPCTSTR lpSubKey,
__in_opt LPCTSTR lpValue,
__in_opt DWORD dwFlags,
__out_opt LPDWORD pdwType,
__out_opt PVOID pvData,
__inout_opt LPDWORD pcbData
);
LONG RegSetValueEx( //设置注册表值
HKEY hKey,
LPCTSTR lpValueName,
DWORD Reserved,
DWORD dwType,
CONST BYTE *lpData,
DWORD cbData
);
4.删除键值:
LONG RegDeleteValue(
HKEY hKey, //待打开的预定义键
LPCTSTR lpSubKEY //欲删除的键名
);
5.删除键:
LONG WINAPI RegDeleteKeyEx(
__in HKEY hKey,
__in LPCTSTR lpSubKey,
__in REGSAM samDesired,
__reserved DWORD Reserved
);
6.重命名键:
NTSTATUS NtRenameKey(
__in HANDLE KeyHandle, //需要重命名的键,键的打开方式必须有KEY_WRITE权限
__in PUNICODE_STRING NewName //键的新名字,只是键的新名字,不需要带路径
);
说明:使用NtRenameKey函数并不在头文件中,使用它需要引用“Ntdll.lib” 。
7.列举注册表项及键值
LONG RegEnumKeyEx( //枚举指定项下方的子项
HKEY hKey,
DWORD dwIndex,
LPWSTR lpName,
LPDWORD lpcName,
LPDWORD lpReserved,
LPWSTR lpClass,
LPDWORD lpcbClass,
PFILETIME lpftLastWriteTime
);
LONG WINAPI RegEnumValue( //枚举指定项的值
__in HKEY hKey,
__in DWORD dwIndex,
__out LPTSTR lpValueName,
__inout LPDWORD lpcchValueName,
__reserved LPDWORD lpReserved,
__out_opt LPDWORD lpType,
__out_opt LPBYTE lpData,
__inout_opt LPDWORD lpcbData
);
LONG RegQueryInfoKey( //获取与一个项有关的信息
HKEY hKey,
LPWSTR lpClass,
LPDWORD lpcbClass,
LPDWORD lpReserved,
LPDWORDlpcSubKeys,
LPDWORD lpcbMaxSubKeyLen,
LPDWORD lpcbMaxClassLen,
LPDWORD lpcValues,
LPDWORD lpcbMaxValueNameLen,
LPDWORD lpcbMaxValueLen,
LPDWORD lpcbSecurityDescriptor,
PFILETIME lpftLastWriteTime
);
8.关闭注册表键:
LONG RegCloseKey(
HKEY hKey // 释放已经打开的注册表句柄
);
示例代码:
创建注册表键值:
DWORD SetRegistry(char *szRegPort, char *szKey, char *szValue)
{
char ValueName[128];
HKEY hkPort;
DWORD cbData = 256;
DWORD retCode, dwDisp;
if ((retCode=RegCreateKeyEx(HKEY_LOCAL_MACHINE, szRegPort, 0, NULL, REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, NULL, &hkPort, &dwDisp)) == ERROR_SUCCESS)
{
lstrcpy(ValueName, szKey);
retCode = RegSetValueEx(hkPort, // Key handle returned from RegOpenKeyEx.
ValueName, // Name of value.
0, //reserved , must be null
REG_SZ, // Type of data.
(PBYTE)szValue, // Data buffer.
strlen(szValue)); // Size of data buffer.
RegCloseKey(hkPort);
}
return retCode;
}
查询注册表键:
DWORD QueryRegistry(char *szRegPort, char *szKey, char *szValue)
{
char ValueName[128];
HKEY hkPort;
BYTE bData[256]; // in registry the max length is banner user name
DWORD cbData = 256;
DWORD retCode;
DWORD dwType=REG_SZ;
if ((retCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szRegPort, 0, KEY_EXECUTE, &hkPort)) == ERROR_SUCCESS)
{
lstrcpy(ValueName, szKey);
retCode = RegQueryValueEx (hkPort, // Key handle returned from RegOpenKeyEx.
ValueName, // Name of value.
NULL, //reserved , must be null
&dwType, // Type of data.
bData, // Data buffer.
&cbData); // Size of data buffer.
if (retCode == ERROR_SUCCESS)
{
strcpy(szValue,(const char*)bData);
}
RegCloseKey(hkPort);
}
return retCode;
}
注册表实现开机自启动:
//写入注册表,开机自启动
HKEY hKey;
//找到系统的启动项
LPCTSTR lpRun = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
//打开启动项Key
long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
if(lRet == ERROR_SUCCESS)
{
char pFileName[MAX_PATH] = {0};
//得到程序自身的全路径
DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
//添加一个子Key,并设置值
lRet = RegSetValueEx(hKey, "WorkAssist", 0, REG_SZ, (BYTE *)pFileName, dwRet);
//关闭注册表
RegCloseKey(hKey);
if(lRet != ERROR_SUCCESS)
{
AfxMessageBox("系统参数错误,不能随系统启动");
}
}
VC中注册表操作精华
1.查看注册表
HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭
LPCTSTR data_Set = "Software\\Microsoft\\Windows\\CurrentVersion\\";
//1表示根鍵的位置2表示打开的地方3必须为ZEOR4表示打开方式5....
long ret0 = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKEY);
if(ret0 != ERROR_SUCCESS) //如果无法打开hKEY,则终止程序
{
MessageBox("错误:无法打开有关的HKEY");
return;
}
//查询有关的数据(这里表示用户名
LPBYTE owner_Get = new BYTE[80];
DWORD type_1 = REG_SZ;
DWORD cbData_1 = 80;
long ret1 = ::RegQueryValueEx(hKEY, "CommonFilesDir", NULL, &type_1, owner_Get, &cbData_1);
if(ret1 != ERROR_SUCCESS)
{
MessageBox("错误,无法查询有关注册表的信息");
return;
}
CString strname;
strname = CString(owner_Get);
MessageBox(strname);
delete[] owner_Get;
::RegCloseKey(hKEY);
2.修改注册表
HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭
LPCTSTR data_Set = "Software\\Microsoft\\Windows\\CurrentVersion\\";
//1表示根鍵的位置2表示打开的地方3必须为ZEOR4表示打开方式5....
long ret0 = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, data_Set, 0, KEY_READ, &hKEY);
if(ret0 != ERROR_SUCCESS) //如果无法打开hKEY,则终止程序
{
MessageBox("错误:无法打开有关的HKEY");
return;
}
//查询有关的数据(这里表示用户名
LPBYTE owner_Set = 你已取出鍵值的内容
DWORD type_1 = REG_SZ;
DWORD cbData_1 = 你取出键的长度+1
long ret1 = ::RegSetValueEx(hKEY, "RegisteredOwner", NULL, type_1, owner_Set, cbData_1);
if(ret1 != ERROR_SUCCESS)
{
MessageBox("错误,无法查询有关注册表的信息");
return;
}
CString strname;
strname = CString(owner_Get);
MessageBox(strname);
delete[] owner_Get;
::RegCloseKey(hKEY);
3.增加注册表子项
//键名
CString str = "{64FF040-5081-101B}";
LPBYTE addKey = new BYTE[str.GetLength() +1];
CString_To_LPBYTE(str);
HKEY hKey;
long res = RegCreateKey(HKEY_CLASSES_ROOT, "*\\shellex\\添加的条目", &hKey);
//生成注册键值
res = RegSetValueEx(hKey, "", NULL, REG_SZ, addKey, str.GetLength() +1);
delete[] addKey;
RegCloseKey(hKey);
4.删除注册表
long res;
res = RegDeleteKey(HKEY_CLASSES_ROOT", "*\\shellex\\新增的条目");