【WIN32】【C/C++】枚举注册表子项及其值

40 篇文章 6 订阅

title: 调用Win32 API枚举注册表子项及其值


需求

在这里插入图片描述如上图所示,获得其中的名称和数据。

代码

/********************************************************************************
 *
 *        All rights reserved by mingming
 *
 *        filename		: RegQueryMultipleValues
 *        description	:
 *
 *        created by  mingming on Aug. 13th, 2021
 *
 ********************************************************************************/
#include <windows.h>
#include <stdio.h>
#include <atlstr.h>
#include <vector>
#include <iostream>
using namespace std;
#pragma warning(disable:4996)

void main(int argc, char* argv[])
{
	HKEY hKey = NULL;
	
	//KEY_READ | KEY_WOW64_32KEY   HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run
	DWORD samDesire = KEY_READ | KEY_WOW64_64KEY; 
	LPCTSTR lpSubKey = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";

	if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpSubKey, 0, samDesire, &hKey) != ERROR_SUCCESS)
	{
		return;
	}

	FILETIME timeFile;
	long nError = 0;
	VALENT pValent[MAX_PATH];
	DWORD nValentCount = MAX_PATH;
	memset(pValent, 0, sizeof(pValent));

	// 1.获取子项键名
	DWORD dwSizeValueName = MAX_PATH;
	DWORD dwSizeofKeyName = MAX_PATH;
	DWORD dwIndex = 0;
	DWORD dwType;
	TCHAR szValueName[MAX_PATH] = { 0 };
	BYTE szKeyName[MAX_PATH] = { 0 };
	vector<wstring> keyName;

	int nCount = 0;
	do
	{
		nError = RegEnumValue(hKey, dwIndex++, szValueName, &dwSizeValueName, NULL, &dwType, szKeyName, &dwSizeofKeyName);
		if (nError == ERROR_SUCCESS)
		{
			wprintf(L"Key Name = %s\n", (wchar_t *)szValueName);
			//wprintf(L"Key Name = %s\n", (wchar_t *)szKeyName);
			wchar_t wsStr[128];
			_wcsncpy_l(wsStr, (wchar_t *)szValueName,sizeof(szValueName)/sizeof(szValueName[0]),0);
			keyName.push_back(wsStr);

			//VALENT pVal;
			//pVal.ve_valuename = (LPWSTR)wsStr.c_str();//输入值项名称
		}

		dwSizeValueName = MAX_PATH;
		dwSizeofKeyName = MAX_PATH;

	} while (nError != ERROR_NO_MORE_ITEMS);

	for (nCount = 0; nCount <  keyName.size(); nCount++)
	{
		pValent[nCount].ve_valuename = (LPWSTR)keyName[nCount].c_str();
	}

	// 2.根据键名获取值
	{
		char szVale[1024];
		DWORD nValueLen = 1024;

		printf("2.根据键名获取值 Success!\n");

		if (ERROR_SUCCESS == (nError = RegQueryMultipleValues(hKey, pValent, nCount, (LPWSTR)szVale, &nValueLen)))
		{

			printf("RegQueryMultipleValues Success!\n");

			CString szResult;
			printf("------------------------------------------\n");
			for (int i = 0; i < nCount; ++i)
			{

				CString szTemp;
				wcout.imbue(std::locale("chs"));

				/*if (REG_SZ == pVal.ve_type)
				{

					szTemp.Format(_T("第%d个参数[%s]的值是:%s\r"), i,
						pVal.ve_valuename, (char*)pVal.ve_valueptr);

					wcout << "s=" << szTemp.GetString() << endl;
				}
				else if (REG_DWORD == pVal.ve_type)
				{
					szTemp.Format(_T("第%d个参数[%s]的值是:%d\r"), i,
						pVal.ve_valuename, *((DWORD*)pVal.ve_valueptr));

					wcout << "s=" << szTemp.GetString() << endl;
				}*/



				if (REG_SZ == pValent[i].ve_type)
				{

					szTemp.Format(_T("第%d个参数[%s]的值是:%s\r"), i,
						pValent[i].ve_valuename, (char*)pValent[i].ve_valueptr);

					wcout << "s=" << szTemp.GetString() << endl;
				}
				else if (REG_DWORD == pValent[i].ve_type)
				{
					szTemp.Format(_T("第%d个参数[%s]的值是:%d\r"), i,
						pValent[i].ve_valuename, *((DWORD*)pValent[i].ve_valueptr));

					wcout << "s=" << szTemp.GetString() << endl;
				}


				if (!szTemp.IsEmpty())

					szResult += szTemp;
			}
			printf("------------------------------------------\n");

		}
		else
		{
			printf("erroe code: %d", nError);
		}


	// Close registry keys.
	if (hKey)
		RegCloseKey(hKey);

	}
	
}

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧恩意

如有帮助,感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值