c++ Windows获取软件安装列表信息

链接

cpp 复制代码
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <vector>
 
using namespace std;
 
#ifndef MSVCR
#define _T
#define _tcscpy strcpy
#define _stprintf sprintf
#define _tcscmp strcmp
#endif
 
class SetupSoftInfo
{
public:
    string displayName;       //软件名称
    string publisher;         //发行商
    string displayVersion;    //版本
    string installDate;       //安装日期
    string uninstallString;   //卸载命令及参数
    void show()
    {
        cout<<"\n=======================================================\n软件名称:"
            <<displayName<<"\n发行商:"<<publisher<<"\n版本:"<<displayVersion
            <<"\n安装日期:"<<installDate<<"\n卸载命令:"<<uninstallString<<endl;
    }
};

//获取所有程序
BOOL GetSetupSofts(vector<SetupSoftInfo>&stupInfo)
{
    const int  MAX_LEG = 256 * sizeof(TCHAR);
    HKEY hKey;
    DWORD dwRegNum = MAX_LEG;
    TCHAR regBufferName[MAX_LEG] = {0};
    if( RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"),
        NULL, KEY_READ, &hKey) == ERROR_SUCCESS    ) {
 
        if( RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwRegNum, NULL, NULL, NULL, NULL, NULL, NULL, NULL)    ==    ERROR_SUCCESS ){
            for( int i = 0; i < (int)dwRegNum; i++ ) {
                DWORD dwRegSize = MAX_LEG;
                RegEnumKeyEx(hKey, i, regBufferName, &dwRegSize, NULL, NULL,
                    NULL, NULL);
                DWORD dwType;
                HKEY hSubKey;
                if(    RegOpenKeyEx(hKey, regBufferName, NULL, KEY_READ, &hSubKey) == ERROR_SUCCESS)
                {
                    SetupSoftInfo info;
                    TCHAR regBufferValue[MAX_LEG] = {0};
                    dwRegSize = MAX_LEG;
                    RegQueryValueEx(hSubKey, _T("DisplayName"), 0, &dwType, (LPBYTE)regBufferValue, &dwRegSize);
                    info.displayName = regBufferValue;        //软件名称
 
                    dwRegSize = MAX_LEG;
                    _tcscpy(regBufferValue,_T(""));
                    RegQueryValueEx(hSubKey, _T("Publisher"), 0, &dwType,(LPBYTE)regBufferValue, &dwRegSize);
                    info.publisher = regBufferValue;        //发行商
 
                    dwRegSize = MAX_LEG;
                    _tcscpy(regBufferValue,_T(""));
                    RegQueryValueEx(hSubKey, _T("DisplayVersion"), 0, &dwType, (LPBYTE)regBufferValue, &dwRegSize);
                    info.displayVersion = regBufferValue;    //版本
 
                    dwRegSize = MAX_LEG;
                    _tcscpy(regBufferValue,_T(""));
                    // 判断是否能在注册表中获取到安装时间, 否取子项创建时间
                    if(RegQueryValueEx(hSubKey, _T("InstallDate"), 0, &dwType, (LPBYTE)regBufferValue, &dwRegSize) == ERROR_SUCCESS )
                    {
                        info.installDate = regBufferValue;
                    }
                    else
                    {
                        FILETIME fileLastTime;
                        RegQueryInfoKey(hSubKey, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                            NULL, NULL, NULL, &fileLastTime);
                        SYSTEMTIME sTime, stLocal ;
                        FileTimeToSystemTime(&fileLastTime,&sTime);
                        SystemTimeToTzSpecificLocalTime(NULL, &sTime, &stLocal);
                        TCHAR tchTime[MAX_LEG] = {0};
                        _stprintf(tchTime,_T("%d%02d%02d"),stLocal.wYear,stLocal.wMonth,stLocal.wDay);
                        info.installDate = tchTime;
                    }
                    dwRegSize = MAX_LEG;
                    _tcscpy(regBufferValue,_T(""));
                    RegQueryValueEx(hSubKey, _T("UninstallString"), 0, &dwType, (LPBYTE)regBufferValue, &dwRegSize);
                    info.uninstallString = regBufferValue;//卸载命令及参数
 
                    dwRegSize = MAX_LEG;
                    _tcscpy(regBufferValue,_T(""));
                    // 取ParentKeyName键值,判断是否是补丁信息, 是补丁信息键值为"OperatingSystem"
                    RegQueryValueEx(hSubKey, _T("ParentKeyName"), 0, &dwType, (LPBYTE)regBufferValue, &dwRegSize);
                    TCHAR tchLocal[MAX_LEG] = {0};
                    _tcscpy(tchLocal,regBufferValue);
 
                    _tcscpy(regBufferValue,_T(""));
                    dwRegSize = MAX_LEG;
                    RegQueryValueEx(hSubKey, _T("QuietUninstallString"), 0, &dwType, (LPBYTE)regBufferValue, &dwRegSize);
                    if( _tcscmp(regBufferValue,_T("") ) )
                    {
                        info.displayName = regBufferName;
                        info.uninstallString = regBufferValue;
                    }
                    if( (info.displayName != _T("") )
                        &&( _tcscmp( tchLocal,_T("OperatingSystem") ) )) //判断是否是补丁信息
                    {
                        stupInfo.push_back(info);
                    }
 
                }
            }//end for(; ;)
        }
    }else {
        return FALSE; //打开键失败
    }
    RegCloseKey(hKey);
 
    return TRUE;
}
 
bool CheckSentinelRunTime(const vector<SetupSoftInfo>& stupInfo)
{
	for(int i=0; i<stupInfo.size();i++){
		if(stupInfo[i].displayName == "xxxxxxx")//xxxxxxx为软件名
			return true;
	}
	return false;
}
int main()
{
    vector<SetupSoftInfo> stupInfo;
    GetSetupSofts(stupInfo);
	bool bl = CheckSentinelRunTime(stupInfo);
	
	cout << ":"<<bl;
	while(1){}
    return 0;
}
相关推荐
半青年9 分钟前
Qt读取Excel文件的技术实现与最佳实践
c语言·c++·python·qt·c#·excel
AA-代码批发V哥13 分钟前
Java-List集合类全面解析
java·开发语言·list
John_ToDebug18 分钟前
Chromium 回调设计实战:BindOnce 与 BindRepeating 的最佳实践
c++·chrome·性能优化
羚羊角uou18 分钟前
【C++】map和multimap的常用接口详解
开发语言·c++
Q_Q196328847524 分钟前
python动漫论坛管理系统
开发语言·spring boot·python·django·flask·node.js·php
摄殓永恒25 分钟前
出现的字母个数
数据结构·c++·算法
举一个梨子zz26 分钟前
Java—— IO流 第一期
java·开发语言
虾球xz30 分钟前
游戏引擎学习第295天:堆叠房间用于Z层调试
c++·人工智能·学习·游戏引擎
Toby_0091 小时前
go 数据类型转换
开发语言·golang
点云SLAM1 小时前
C++中聚合类(Aggregate Class)知识详解和注意事项
c++·算法·c++20·c++学习·聚合类·面向对象设计、·c++高级应用