代码如下:

#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<<"\n=======================================================\n软件名称:"
<<displayName<<"\n发行商:"<<publisher<<"\n版本:"<<displayVersion
<<"\n安装日期:"<<installDate<<"\n卸载命令:"<<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;
}

Windows下C编程获取软件安装列表信息的更多相关文章

  1. python获取软件安装列表2222

    softer_installed_list ===================== 使用python编写的,获取本机软件安装列表,输出为html表格. * win7 32位环境下运行 * 使用的是 ...

  2. 初尝Windows 下批处理编程

    本文叫“ 初尝Windows 下批处理编程”是为了延续上一篇“初尝 Perl”,其实对于博主而言批处理以及批处理编程早就接触过了. 本文包括以下内容 1.什么是批处理 2.常用批处理命令 3.简介批处 ...

  3. Windows下当地RabbitMQ服务的安装

    Windows下本地RabbitMQ服务的安装 本文参考:刘若泽相关技术文档 当然这些内容页可以通过RabbitMQ官方网站获得. RabbitMQ配置说明手册 一.RaibbitMQ服务器配置 1. ...

  4. Windows下的lua-5.3.4安装过程

    Windows下的lua-5.3.4安装过程 Mingw平台下的编译过程: $ make echo$ make mingw$ make local $ make echo PLAT= none CC= ...

  5. windows下python常用库的安装

    windows下python常用库的安装,前提安装了annaconda 的python开发环境.只要已经安装了anaconda,要安装别的库就很简单了.只要使用pip即可,正常安装好python,都会 ...

  6. windows下使用cpanm进行模块安装

    windows下使用cpanm进行模块安装 要放假了,突然想整理一下手头上的软件,突然发现perl的安装模块这个功能不能用. 弄了一下,使得windows 下 perl 的 cpanm能用,避免成天为 ...

  7. 初探WINDOWS下IME编程

    初探WINDOWS下IME编程作者:广东南海市昭信科技有限公司-李建国 大家知道,DELPHI许多控件有IME属性.这么好用的东西VC可没自带,怎么办呢?其实,可通过注册表,用API实现.下面说一下本 ...

  8. Windows下cmd的替代软件——PowerCmd

    Powercmd 是一款运行在windows下的cmd增强软件(A Better Command Prompt Replacement Tool),当前最新的版本为2.2. 官方提供试用版,貌似没有功 ...

  9. windows下配置lamp环境(1)---安装Apache服务器2.2.25

    window下lamp成为wamp; 安装wamp环境的第一步是安装Apache服务器.下面开始安装步骤图文并茂. 一.双击安装包点“next”进行下一步,然后同意协议(这张图没有截):

随机推荐

  1. [LeetCode] Clone Graph 无向图的复制

    Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...

  2. [LeetCode] Binary Tree Level Order Traversal 二叉树层序遍历

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...

  3. 应如何取B/S的B端的IP

    我们常讨论说要取真实IP,不同场景所谓的真实IP含义不一样. 如你要根据客户端IP去判断客户所在区域,那么要记录客户的出口IP,这里的出口IP才是你所谓的真实IP. 如你要判断多个客户端是不是同一个, ...

  4. .Net4.0以上使用System.Data.Sqlite

    最近对Sqlite感兴趣,就尝试了一下用c#连接,我用的版本是vs2013,默认开发环境是.net4.5,,按照网上的教材,下载了System.Data.Sqlite,然后写了下面这个简单的测试代码, ...

  5. GreenDao的使用

    1.生成代码文件

  6. jQuery 树形菜单

    树形菜单 在 jQuery easyu中其左侧的主菜单使用的是 easyui 中的 tree 组件,不是太熟悉,不过感觉不是太好用. 比如 easyui 中的 tree 需要单击分叉节点前的小三角,才 ...

  7. jQuery Mobile入门

    转:http://www.cnblogs.com/linjiqin/archive/2011/07/17/2108896.html 简介:jQuery Mobile框架可以轻松的帮助我们实现非常好看的 ...

  8. eclipse连接多个git仓库方法

    只需要在本地建立多个仓库就行,提交的时候一个本地仓库对应一个git仓库

  9. Beta阶段项目展示

    1.团队简介 韩青长 前端工程师 我是韩青长,技术小白,抱着对软工的好奇和对未来工作的憧憬选了这门课.暂时选择了测试的工作,也对开发和UI有一定兴趣.从前上帝创造了我们,现在轮到我们来创造自己的软件了 ...

  10. EasyUI 解决 datagrid 中 NumberBox 限制小数位数后不能输入小数点问题

    初始化界面,发现编辑datagrid,不能输入小数点. var arrColumnsCNT = [[ { title: '毛重', field: 'GrossWeight', halign: 'cen ...