Windows系统编程(十二)注册表操作及遍历

注册表

如图,这就是我们电脑中的注册表,即操作系统的配置文件,我们可以在注册表中找到软件的相关信息

如上图就是32位软件安装列表,其路径为:HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall。
其存储了软件卸载相关的信息,我们可以通过该目录达到卸载软件的目的

另外以下目录也很重要:

32位软件开机启动项:HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run

64位软件开机启动项:HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

64位软件安装列表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall.

注册表遍历

接下来我们对注册表进行一个应用:64位软件安装列表

#include <iostream>
#include <Windows.h>
#include <tchar.h>
#include <shlwapi.h>
#pragma comment(lib,"Shlwapi.lib")

typedef struct _SOFTINFO
{
	TCHAR szSoftName[50];							//软件名称
	TCHAR szSoftVer[50];							//软件版本号
	TCHAR szSoftVenRel[50];							//软件发布厂商
	TCHAR szSoftData[20];							//软件安装日期
	TCHAR szSoftInsPath[MAX_PATH];					//软件安装路径
	TCHAR szSoftUniPath[MAX_PATH];					//软件卸载路径
}SOFTINFO, *PSOFTINFO;

VOID ShowInstall(const char * szKey)
{
	SOFTINFO stcSoftInfo = { 0 };
	HKEY key;
	HKEY sKey;
	DWORD dwIndex = 0;
	char szSubKey[MAX_PATH] = { 0 };
	DWORD dwBufferSize = 255;
	std::string temoSkey;
	DWORD dwType = REG_SZ;//以 null 结尾的字符串
	DWORD dwSize = 255;
	
	RegOpenKeyExA(HKEY_LOCAL_MACHINE, szKey, NULL, KEY_READ, &key);//打开注册表
	while (SHEnumKeyExA(key, dwIndex++, szSubKey,&dwBufferSize) != ERROR_NO_MORE_ITEMS)//打开注册表项的子项
	{
		std::string strtmp(szSubKey);
		temoSkey = szKey;
		temoSkey += "\\";
		temoSkey += strtmp;
		if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, temoSkey.c_str(),NULL, KEY_READ, &sKey) == ERROR_SUCCESS)
		{
			RegQueryValueExA(sKey, "DisplayName", NULL, &dwType, (LPBYTE)stcSoftInfo.szSoftName, &dwSize);
			dwSize = 255;
			RegQueryValueExA(sKey, "DisplayVersion", NULL, &dwType, (LPBYTE)stcSoftInfo.szSoftVer, &dwSize);
			dwSize = 255;
			RegQueryValueExA(sKey, "InstallLocation", NULL, &dwType, (LPBYTE)stcSoftInfo.szSoftInsPath, &dwSize);
			dwSize = 255;
			RegQueryValueExA(sKey, "Publisher", NULL, &dwType, (LPBYTE)stcSoftInfo.szSoftVenRel, &dwSize);
			dwSize = 255;
			RegQueryValueExA(sKey, "UninstallString", NULL, &dwType, (LPBYTE)stcSoftInfo.szSoftUniPath, &dwSize);
			dwSize = 255;
			RegQueryValueExA(sKey, "InstallDate", NULL, &dwType, (LPBYTE)stcSoftInfo.szSoftData, &dwSize);
			dwSize = 255;
		}
		printf("软件名称:%s\r\n", stcSoftInfo.szSoftName);
		printf("软件版本号:%s\r\n", stcSoftInfo.szSoftVer);
		printf("软件发布厂商:%s\r\n", stcSoftInfo.szSoftVenRel);
		printf("软件安装日期:%s\r\n", stcSoftInfo.szSoftData);
		printf("软件安装路径:%s\r\n", stcSoftInfo.szSoftInsPath);
		printf("软件卸载路径:%s\r\n", stcSoftInfo.szSoftUniPath);
		std::cout << std::endl;
		memset(szSubKey, 0, MAX_PATH);
		RegCloseKey(sKey);
		dwBufferSize = 255;
	}
}

int main()
{
	ShowInstall("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall");
	system("pause");
	return 0;
}

作业

实现注册表启动项的遍历

#include <windows.h>
#include <iostream>

struct SOFTRUN
{
    WCHAR szSoftName[MAX_PATH]; //软件名称
    WCHAR szSoftPath[MAX_PATH]; //软件路径
};

void ShowRun(const char* szKey)
{
    HKEY hKey;
    SOFTRUN softrun = { 0 };
    DWORD NameSize = sizeof(softrun.szSoftName);
    DWORD type = REG_SZ;
    DWORD PathSize = sizeof(softrun.szSoftPath);
    DWORD dwIndex = 0;
    if (RegOpenKeyExA(HKEY_CURRENT_USER, szKey, NULL, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS)
    {
        while (RegEnumValue(hKey, dwIndex, softrun.szSoftName, &NameSize, NULL, &type, (LPBYTE)softrun.szSoftPath, &PathSize) == ERROR_SUCCESS)
        {
            printf("软件名称为:%S\r\n", softrun.szSoftName);
            printf("软件路径为:%S\r\n", softrun.szSoftPath);
            NameSize = sizeof(softrun.szSoftName);
            PathSize = sizeof(softrun.szSoftPath);
            std::cout << std::endl;
            dwIndex++;
        }
    }
    RegCloseKey(hKey);
}

int main()
{
    ShowRun("Software\\Microsoft\\Windows\\CurrentVersion\\Run");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值