版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunjikui1255326447/article/details/88847706
C/C++注册表【4】键值的获取,设置,删除,枚举
1、键值的获取:
LONG WINAPI RegQueryValueEx(
HKEY hKey, //一个已打开项的句柄,或者指定一个标准项名
LPCTSTR lpValueName, // 要获取值的名字
LPDWORD lpReserved, // 未用,设为零
LPDWORD lpType, // 用于装载取回数据类型的一个变量
LPBYTE lpData, // 用于装载指定值的一个缓冲区
LPDWORD lpcbData // 用于装载lpData缓冲区长度的一个变量。一旦返回,它会设为实际装载到缓冲区的字节数
);
返回值 Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码
MSDN介绍:https://docs.microsoft.com/zh-cn/windows/desktop/api/winreg/nf-winreg-regdeletevaluea
lpValueName 指向要查询值的名字的字符串(以空字符结束)。 如果lpValueName是NULL或一个空字符串(""),这个函数找回这个键的未命名或默认值的类型和数据。 Windows 95和Windows 98: 每个键有一个默认值(最初的不包含数据)。在Windows 95,这人默认值类型总是REG_SZ。在Windows 98,默认键的类型最初是REG_SZ,但可以通过RegSetValueEx指定一个默认值为不同的类型。
实例:
void CTestDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
DWORD dwValueCount = 0, maxValueNameLen = 0, maxValueDataLen = 0;
lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValueCount, &maxValueNameLen, &maxValueDataLen, NULL, NULL);
if (lRet == ERROR_SUCCESS) {
DWORD dwType = 0;
BYTE *lpData = new BYTE[maxValueDataLen + 1];
ZeroMemory(lpData, maxValueDataLen + 1);
lRet = RegQueryValueEx(hKey, _T("360Safetray"), NULL, &dwType, lpData, &maxValueDataLen);
CString strValue;
strValue.Format(_T("%s"), lpData);
MessageBox(strValue);
delete[] lpData;
}
RegCloseKey(hKey);
}
CDialogEx::OnOK();
}
2、键值设置:
RegSetValueEx函数可以设置注册表中键的值,函数原型如下:
LONG RegSetValueEx(HKEY hKey, //主键值
LPCTSTR lpValueName, //参数lpValueName为一个指向包含值名的字符串指针。
DWORD Reserved, //Reserved保留,通常必须设置为0
DWORD dwType, //参数dwType确定了设置的值的类型同RegQueryValueKeyEx的lyType参数。
CONST BYTE *lpData, //参数lpData为一个指向包含数据的缓冲区的指针
DWORD cbData //参数cbData以字节为单位,指定数据的长度
);
返回值 Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码
实例:
void CTestDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
CString strPath = _T("F:\\工具\\fildder\\Fiddler\\Fiddler.exe");
RegSetValueEx(hKey, _T("GP_CLT_JIT"), 0, REG_SZ, (LPBYTE)strPath.GetBuffer(), strPath.GetLength() * sizeof(TCHAR));
RegCloseKey(hKey);
}
CDialogEx::OnOK();
}
3、键值的删除:RegDeleteValue
LSTATUS RegDeleteValueA(
HKEY hKey,
LPCSTR lpValueName
);
void CTestDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
RegDeleteValue(hKey, _T("TestRun"));
RegCloseKey(hKey);
}
CDialogEx::OnOK();
}
4、键值的枚举操作:RegEnumValue
RegEnumValue(hkey, //被枚举的键句柄
dwIndex, //子键索引编号
lpValueName, //键值名称
lpcbValueName, //键值名称长度
lpReserved, //系统保留,指定为0
lpType, //键值数据类型
lpDate, //键值数据
lpcbDate //键值数据长度
);
实例:
void CTestDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
DWORD dwValueCount = 0, maxValueNameLen = 0, maxValueDataLen = 0;
lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValueCount, &maxValueNameLen, &maxValueDataLen, NULL, NULL);
if (lRet == ERROR_SUCCESS) {
DWORD dwNameLen = maxValueNameLen + 1;
TCHAR *pszName = new TCHAR[dwNameLen];
DWORD dwType = 0;
DWORD dwValueDataLen = maxValueDataLen + 1;
BYTE *lpValueData = new BYTE[dwValueDataLen];
for (DWORD dwIndex = 0; dwIndex < dwValueCount; ++dwIndex) {
dwNameLen = maxValueNameLen + 1;
ZeroMemory(pszName, dwNameLen);
dwValueDataLen = maxValueDataLen + 1;
ZeroMemory(lpValueData, dwValueDataLen);
lRet = RegEnumValue(hKey, dwIndex, pszName, &dwNameLen, NULL, &dwType, lpValueData, &dwValueDataLen);
//Other operations
CString strValueName;
strValueName.Format(_T("%s"), pszName);
MessageBox(strValueName); //子键名称
CString strValueData;
strValueData.Format(_T("%s"), lpValueData);
MessageBox(strValueData); //子键的value
}
delete[] pszName;
delete[] lpValueData;
RegCloseKey(hKey);
}
}
CDialogEx::OnOK();
}
声明:本代码参考部分VC驿站教程。