zoukankan      html  css  js  c++  java
  • Windows下C编程获取软件安装列表信息

    代码如下:

    #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
    
    typedef struct SetupSoftInfo
    {
        string displayName;        //软件名称
        string publisher;            //发行商
        string displayVersion;    //版本
        string installDate;        //安装日期
        string uninstallString;    //卸载命令及参数
        void show()
        {
            cout<<"
    =======================================================
    软件名称:"
                <<displayName<<"
    发行商:"<<publisher<<"
    版本:"<<displayVersion
                <<"
    安装日期:"<<installDate<<"
    卸载命令:"<<uninstallString<<endl;
        }
    }*PSetupSoftInfo;
    
    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;
    }
    
    
    int main()
    {
        cout << "开始输出!" << endl;
        vector<SetupSoftInfo> stupInfo;
        GetSetupSofts(stupInfo);
    
        for(auto& x:stupInfo){
            x.show();
        }
    
    
        return 0;
    }
    
  • 相关阅读:
    mysql 索引
    redis持久化
    redis发布订阅
    django 信号
    paramiko模块
    23种设计模式python实现
    几种浏览器存储数据的方式
    关于传参
    对字符串里的四则运算进行计算2020/10/12
    动手动脑2020/10/9
  • 原文地址:https://www.cnblogs.com/oloroso/p/6136428.html
Copyright © 2011-2022 走看看