当前位置: 首页 > news >正文

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

链接

#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
#endifclass 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;
}

相关文章:

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

链接 #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 #endifclass SetupSoftInfo { publ…...

音视频学习笔记——c++多线程(一)

✊✊✊&#x1f308;大家好&#xff01;本篇文章主要整理了部分多线程相关的内容重点&#x1f607;。首先讲解了多进程和多线程并发的区别以及各自优缺点&#xff0c;之后讲解了Thead线程库的基本使用。 本专栏知识点是通过<零声教育>的音视频流媒体高级开发课程进行系统…...

消息队列常见问题

总的来讲&#xff0c;消息队列常见问题要么消息不能多&#xff0c;要么不能少&#xff0c;还有顺序性&#xff0c;以及积压处理的问题等。 1.消息不能多 也就是说&#xff0c;消息不能重复消费&#xff0c;随之带来的幂等性问题。 解决&#xff1a;一般结合业务场景&#xf…...

【leetcode热题】二叉树的前序遍历

难度&#xff1a; 中等通过率&#xff1a; 49.5%题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个二叉树&#xff0c;返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1\2/3 输出: [1,2,3]进阶: 递归算法很简单&#xff0c;你可以通过迭代…...

Linux命令记不住?保姆级教程来了

在软件开发过程中&#xff0c;Linux操作系统因其稳定性、安全性和高效性而备受青睐。作为开发者&#xff0c;熟练掌握Linux常用命令&#xff0c;不仅可以提高工作效率&#xff0c;还能更好地管理服务器和进行代码部署。本文将介绍一些开发常用的Linux命令及其应用场景&#xff…...

基于GitBucket的Hook构建ES检索PDF等文档全栈方案

背景 之前已简单使用ES及Kibana和在线转Base64工具实现了检索文档的demo&#xff0c;预期建设方案是使用触发器类型从公共的文档源拉取最新的文件&#xff0c;然后调用Java将文件转Base64后入ES建索引&#xff0c;再提供封装接口给前端做查询之用。 由于全部内容过长&#xff…...

C语言:数组、字符串知识点整理:

数组&#xff1a;&#xff08;长度的计算&#xff09; 补充&#xff1a;数组长度sizeof(arr)/sizeof(arr[0]) 注意&#xff1a;&#xff01;&#xff01;&#xff01;不适用于当arr 充当形参时&#xff08;函数传参&#xff09;&#xff01;&#xff01;&#xff01; 因为函数…...

Linux mmap系统调用

文章目录 前言一、mmap()函数简介二、代码演示2.1 mmap使用场景2.2 私有匿名映射2.3 私有文件映射2.4 共享匿名映射2.5 共享文件映射 参考 前言 NAMEmmap, munmap - map or unmap files or devices into memorySYNOPSIS#include <sys/mman.h>void *mmap(void *addr, siz…...

VSCode搭建ARM开发环境

为了构建Cortex M系列单片机免费开源的开发环境&#xff0c;网络上了解来看VSCODEGCCJLINK是一套比较高效的组合方式&#xff0c;下面记录环境搭建的流程。 我这边的PC环境为 WIN7专业版64bit。 需要用到的工具 Visual Studio CodeSTM32CubemxARM GCC 交叉编译工具链&#x…...

centos7 python3.12.1 报错 No module named _ssl

https://blog.csdn.net/Amio_/article/details/126716818 安装python cd /usr/local/src wget https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz tar -zxvf Python-3.12.1.tgz cd Python-3.12.1/ ./configure -C --enable-shared --with-openssl/usr/local/opens…...

探索HTTP协议:网络通信的基石

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

几大开源免费的 JavaScript 富文本编辑器测评

MarkDown 编辑器用的时间长了&#xff0c;发现发现富文本编辑器用起来是真的舒服。 一直以来写博客都是用的 MarkDown 编辑器&#xff0c;MarkDown 文档简单方便&#xff0c;使用几个简单的符号就可以定义出样式统一的富文本内容。写博客的时间长了&#xff0c;小玖就越来越排…...

MongoDB聚合运算符:$dateFromString

文章目录 语法使用使用例子对规则进行说明格式指示符 举例日期转换错误处理onError空值的粗粒 onNull $dateFromString聚合运算符将日期时间字符串转换为日期对象。 语法 { $dateFromString: {dateString: <dateStringExpression>,format: <formatStringExpression&g…...

Postman(注册,使用,作用)【详解】

目录 一、Postman 1. Postman介绍 2. 安装Postman 3. 注册帐号再使用(可保存测试记录) 4. 创建workspace 5. 测试并保存测试记录 一、Postman postman工具可以发送不同方式的请求,浏览器只能发送get请求(所有用这个工具) 在前后端分离开发模式下&#xff0c;前端技术人员…...

电商数据分析18——电商广告投放的数据分析与优化

目录 写在开头1. 电商广告投放的挑战与机遇1.1 广告投放的主要目标与挑战1.2 广告数据分析的价值 2. 数据分析在广告投放中的应用2.1 目标受众分析与精准定位2.2 广告效果评估与ROI分析2.3 A/B测试与广告内容优化 3. 广告投放优化的实践案例3.1 案例分享&#xff1a;精准定向提…...

Docker下Jenkins打包java项目并部署

docker 构建Jenkins sudo docker run --namezen_haslett --userjenkins --privilegedtrue --volume/home/cyf/server/jenkins/jenkins_home:/var/jenkins_home -v /usr/lib/jvm/java-17-openjdk-amd64:/usr/lib/jvm/java-17-openjdk-amd64 -v /usr/lib/maven/apache-mav…...

android 快速实现 recyclerview 的所有item 都执行动画

1.在adapter 里面重写onViewAttachedToWindow 和 onViewDetachedFromWindow 两个方法 package com.example.widget;import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.LinearInterpolator; import android.view.animat…...

Excel转pdf

1、excel-内存值--Workbook 转pdf /** * excel To pdf * * param outPath 输出路径 * param workbook excel-内存值 * throws IOException */ public static void excelToPdf(String outPath,Workbook workbook) throws IOException, DocumentException { Document documentnul…...

QT:用opencv的KNN识别图片中的LED数字(一)

前言 一款功能测试的软件demo,使用了QT作为界面,主要使用了opencv的KNN识别,使用gstreamer作为管道,用来打开图片。后期会写一篇打开摄像头实时识别的文章。 (正在写,未完成,稍候) 效果一预览: 效果二预览: 效果三预览: 正在写。。。 设计思路 1. 软件UI设计 2. …...

leetcode72. 编辑距离

leetcode72. 编辑距离 题目 思路 dp[i][j] 代表 word1 到 i 位置转换成 word2 到 j 位置需要最少步数&#xff0c;所以&#xff0c; 当 word1[i] word2[j]&#xff0c;dp[i][j] dp[i-1][j-1]&#xff1b; 当 word1[i] ! word2[j]&#xff0c;dp[i][j] 1 min(dp[i-1][j-1]…...

Bebas Neue:为什么这款开源免费商用字体是现代设计的完美解决方案?

Bebas Neue&#xff1a;为什么这款开源免费商用字体是现代设计的完美解决方案&#xff1f; 【免费下载链接】Bebas-Neue Bebas Neue font 项目地址: https://gitcode.com/gh_mirrors/be/Bebas-Neue 你是否曾经在设计项目中选择字体时陷入两难境地&#xff1f;商业字体价…...

保姆级教程:用Python和DepthAI库快速上手OAK-D,实现双目摄像头画面拼接

Python与DepthAI实战&#xff1a;OAK-D双目画面拼接全流程解析 刚拿到OAK-D设备的开发者常会遇到这样的困境&#xff1a;硬件连接完成了&#xff0c;官方文档也浏览过&#xff0c;但面对DepthAI的管道概念和代码结构仍感到无从下手。本文将以双目画面拼接这个具体目标为切入点…...

Pixel Epic智识终端多场景落地:金融/咨询/高校研报自动化实践

Pixel Epic智识终端多场景落地&#xff1a;金融/咨询/高校研报自动化实践 1. 引言&#xff1a;当研究报告遇上像素冒险 在金融分析、咨询服务和学术研究领域&#xff0c;撰写高质量研究报告一直是一项耗时费力的工作。传统的研究工具往往界面单调、操作复杂&#xff0c;让本应…...

从微波炉变压器到精密焊接:详解DIY点焊机中‘自动触发笔’的工作原理与升级方案

从微波炉变压器到精密焊接&#xff1a;详解DIY点焊机中‘自动触发笔’的工作原理与升级方案 在业余电子制作和小规模金属加工中&#xff0c;点焊机因其高效、低成本的特性成为不可或缺的工具。许多DIY爱好者会选择改造废旧微波炉变压器来制作简易点焊机&#xff0c;但往往忽视了…...

3分钟完成Windows Defender永久禁用:开源控制工具终极指南

3分钟完成Windows Defender永久禁用&#xff1a;开源控制工具终极指南 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/de/defender-control …...

Zotero-SciPDF:3分钟解决文献下载难题的智能科研助手

Zotero-SciPDF&#xff1a;3分钟解决文献下载难题的智能科研助手 【免费下载链接】zotero-scipdf Download PDF from Sci-Hub automatically For Zotero7 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-scipdf 还在为找不到学术论文PDF而烦恼吗&#xff1f;每天花…...

5G NR测量配置全解析:从SSB波束管理到CSI-RS,一篇讲透与LTE的十大区别

5G NR测量配置全解析&#xff1a;从SSB波束管理到CSI-RS&#xff0c;一篇讲透与LTE的十大区别 当5G网络开始在全球范围内铺开&#xff0c;许多通信工程师和技术爱好者发现&#xff0c;从LTE到5G NR的过渡并非简单的技术迭代&#xff0c;而是一次彻底的架构革新。特别是在测量配…...

手把手教你用FMD LINK烧录器搞定FT60F010A单片机(附SOT23-6接线图)

从零开始掌握FT60F010A单片机烧录&#xff1a;FMD LINK烧录器实战指南 当你第一次拿到那片比指甲盖还小的FT60F010A单片机时&#xff0c;可能会被它SOT23-6封装上那些微小的引脚难住。作为辉芒微(FMD)旗下极具性价比的8位MCU&#xff0c;这款芯片在智能家居遥控器、小型传感器等…...

FPGA实战:手把手教你用AXI EMC IP核驱动64M Nor Flash(附S29GL512S时序参数详解)

FPGA实战&#xff1a;AXI EMC IP核驱动64M Nor Flash全流程解析 引言 在嵌入式系统开发中&#xff0c;Nor Flash因其可靠的存储性能和简单的接口特性&#xff0c;成为许多关键应用的理想选择。当我们需要在Xilinx FPGA平台上扩展存储容量时&#xff0c;AXI External Memory Con…...

不止于调试:挖掘J-Link Commander隐藏命令,玩转芯片信息读取与安全启动

深入探索J-Link Commander&#xff1a;解锁芯片信息读取与安全启动的高级技巧 当大多数开发者将J-Link视为简单的调试工具时&#xff0c;它实际上隐藏着令人惊讶的硬件交互能力。想象一下&#xff0c;你不仅能调试代码&#xff0c;还能直接与芯片内部的各种寄存器对话&#xff…...