注册表
如图,这就是我们电脑中的注册表,即操作系统的配置文件,我们可以在注册表中找到软件的相关信息
如上图就是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;
}