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<<"\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;
}