C/C++注册表【4】键值的获取,设置,删除,枚举

版权声明:本文为博主原创文章,未经博主允许不得转载。 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驿站教程。

猜你喜欢

转载自blog.csdn.net/sunjikui1255326447/article/details/88847706