`
yuanlanjun
  • 浏览: 1187280 次
文章分类
社区版块
存档分类
最新评论

VC 读注册表获取安装程序

 
阅读更多

Windows 系统中,安装程序都可以在注册表HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Windows\CurrentVersion\Uninstall 获取,并且xp、vista、win7、win8都一样

打开注册表命令:regedit,依次展开上述注册表路径,安装程序列表如下图:



获取系统安装程序列表:

// 获取系统安装程序列表 
 BOOL CMyListCtrlTestDlg::AllRegKey(HKEY hKey, LPCTSTR szDesKeyItem) 
 { 
     HKEY hSubKey; 
     DWORD dwIndex = 0; 
     long lResult; 
     int i = 1; 
  
     lResult = RegOpenKeyEx(hKey, szDesKeyItem, 0, KEY_READ, &hSubKey);      // 打开注册表 
     if(ERROR_SUCCESS == lResult) { 
         TCHAR szKeyName[256] = { 0 }; 
         DWORD cbName = 256*sizeof(TCHAR); 
  
         lResult = RegEnumKeyEx(hSubKey, dwIndex, szKeyName, &cbName, 0, NULL, NULL, NULL);      // 获取字段 
         while (lResult == ERROR_SUCCESS && lResult != ERROR_MORE_DATA){ 
             OutputDebugString(szKeyName); 
  
  
             CString str; 
             str.Format(_T("%d"), i); 
  
             i = m_MyList.InsertItem(i, str);        // 插入到List控件显示 
             m_MyList.SetItemText(i,1,szKeyName); 
  
  
             dwIndex = dwIndex + 1;          // 改变dwIndex,循环获取下移字段 
             cbName = 256*sizeof(TCHAR); 
             lResult = RegEnumKeyEx(hSubKey, dwIndex, szKeyName, &cbName, 0, NULL, NULL, NULL); 
  
             i++; 
  
         } 
         RegCloseKey(hSubKey);       // 关闭注册表 
         return TRUE; 
     } 
     RegCloseKey(hSubKey); 
     return FALSE; 
 } 



获取安装程序属性信息(二次读取注册表):

BOOL SoftList::AllRegKey(HKEY hKey, LPCTSTR szDesKeyItem)
{
	HKEY hSubKey;
	DWORD dwIndex = 0;
	long lResult;

	lResult = RegOpenKeyEx(hKey, szDesKeyItem, 0, KEY_READ, &hSubKey);		// 打开注册表
	if(ERROR_SUCCESS == lResult) {
		int id = 1;						// 序号
		TCHAR s_name[256] = {0};		// 软件名			
		TCHAR s_DisplayName[256] = {0};			// 显示名称
		TCHAR s_Publisher[256] = {0};			// 发布者
		TCHAR s_InstallDate[12] = {0};			// 安装日期
		DWORD s_EstimatedSize;					// 大小
		TCHAR s_DisplayVersion[256] = { 0 };	// 版本
		DWORD cbName = 256*sizeof(TCHAR);	
		DWORD cbName2 = sizeof(TCHAR);

		DWORD typeSZ = REG_SZ;			// SZ 注册表类型
		DWORD typeDWORD = REG_DWORD;	// DWORD 注册表类型

		lResult = RegEnumKeyEx(hSubKey, dwIndex, s_name, &cbName, 0, NULL, NULL, NULL);		// 获取字段
		while (lResult == ERROR_SUCCESS && lResult != ERROR_MORE_DATA){
			OutputDebugString(s_name);

			CString str;
			str.Format(_T("%d"), id);

			id = m_SoftList.InsertItem(id, str);		// 插入到List控件显示
			m_SoftList.SetItemText(id, 1, s_name);


			HKEY hItem;		// 下一级注册表句柄
			if(::RegOpenKeyEx(hSubKey, s_name, 0, KEY_READ, &hItem) == ERROR_SUCCESS){		// 提取下一级注册表程序的属性信息
				if (::RegQueryValueEx(hItem, _T("DisplayName"), 0, &typeSZ, (LPBYTE)s_DisplayName, &cbName) == ERROR_SUCCESS) {
					m_SoftList.SetItemText(id, 1, s_DisplayName);
				}

				if (::RegQueryValueEx(hItem, _T("Publisher"), 0, &typeSZ, (LPBYTE)s_Publisher, &cbName) == ERROR_SUCCESS) {
					m_SoftList.SetItemText(id, 2, s_Publisher);
				}

				if (::RegQueryValueEx(hItem, _T("InstallDate"), 0, &typeSZ, (LPBYTE)s_InstallDate, &cbName) == ERROR_SUCCESS) {
					if (s_InstallDate != NULL) {		// 判断是否为空
						m_SoftList.SetItemText(id, 3, s_InstallDate);		
					}
				}

				if (::RegQueryValueEx(hItem, _T("EstimatedSize"), 0, &typeDWORD, (LPBYTE)&s_EstimatedSize, &cbName2) == ERROR_SUCCESS) {
					float f_Size = s_EstimatedSize/1024.0;	// DWORD 转换为 CString 类型
					CString p_Size;
					p_Size.Format(_T("%.2f M"), f_Size);
					
					m_SoftList.SetItemText(id, 4, p_Size);
				}

				if (::RegQueryValueEx(hItem, _T("DisplayVersion"), 0, &typeSZ, (LPBYTE)s_DisplayVersion, &cbName) == ERROR_SUCCESS) {
					m_SoftList.SetItemText(id, 5, s_DisplayVersion);
				}
				
				::RegCloseKey(hItem);	// 关闭二级注册表(程序属性信息)
			}


			dwIndex = dwIndex + 1;			// 改变dwIndex,循环获取下移字段
			cbName = 256*sizeof(TCHAR);
			lResult = RegEnumKeyEx(hSubKey, dwIndex, s_name, &cbName, 0, NULL, NULL, NULL);

			id++;

		}
		RegCloseKey(hSubKey);	// 关闭一级注册表(读取程序信息)
		return TRUE;
	}
	RegCloseKey(hSubKey);
	return FALSE;
}

通过注册表路径获取调用:

AllRegKey(HKEY_LOCAL_MACHINE, TEXT("SoftWare\\Microsoft\\Windows\\CurrentVersion\\Uninstall"));


运行结果:



分享到:
评论

相关推荐

    VC 读注册表获取安装程序(修改版)

    网友小罗6327上传的VC 读注册表获取安装程序源码有一处错误,导致部分安装程序名显示不对,现做修改并重新上传,修改部分见SoftwareViewDlg.cpp中的CSoftwareViewDlg::GetSoftwareInfo函数。再次向小罗6327致敬。

    vc编写的注册表解析程序

    vc编写的注册表解析程序,希望对从事注册表解析的SS又所帮助

    VC写的获取硬盘物理序列号

    用VC 写的MFC程序 读出硬盘物理序列号并写入到生成txt文件

    玩转注册表(VC2008 MFC 注册表操作)

    注册表修改程序,主要通过修改注册表来获取、修改操作系统的设置 可以通过它来了解VC对注册表的基本操作,也可以通过它来设置机器信息。

    mfc 对话框托盘、气泡、读写注册表、控制鼠标键盘、定时器

    本程序适合vc初学者学习使用,软件实现鼠标位置的获取,屏幕大小的获取,鼠标指定位置单击,单击间隔和次数可以设置,定时器的使用,这是一个对话框程序,实现了托盘、气泡、读写注册表,系统热键的使用等等 在vc60...

    精睿 ESET_VC52_UPID 获取器安装版

    1、精睿ESET_VC52_UPID获取器,本工具支持2.7、3.0、4.0、4.2版本。 2、本工具运行时先验证电脑里ESET的ID(支持所有版本。包括4.2),无效就自动申请ID验证后写入注册表。 3、自我排除功能,当程序首次运行时自动将...

    ESET VC52 UPID

    ESET VC52 UPID (x86/X64)(获取ESET ID) 6.1.1.1 软件名:ESET VC52 UPID 版本:6.1.1.1 支持ESET版本:2.7、3.0、4.0 、4.2、5.0、6.0、7.0 语言:简体中文 类型:ESET(NOD32)ID获取工具 授权:免费版 适合位系统...

    windows vc获取网卡编号名称

    1. 本程序通过两种方式获取本机的网卡编号和网卡名称 (1)API的方式 (2)注册表的方式 希望对大家有所帮助

    C++程序设计技巧

    一些常用的VC程序设计技巧! 2000.11.4 混用两大 Application Framework VCL & MFC 使用WinInet类进行Internet编程 在C++ Builder3下实现程序自动运行的方法 让应用程序禁止Windows屏幕保护 巧妙保证程序只有一...

    VC++ 获取电脑用户账户名称 注册表屏蔽某些按键 Del Alt Win键

    本程序首先判断程序处于何种用户下做出注册表。不同的设置。在Administrator账户下,删除屏蔽某些键盘的键值;在非管理员账户下屏蔽掉Delete键,左右Alt键和Win键。在使用时请注意一些,以免造成不必要的麻烦。

    VC读取QQ路径

    本程序演示了如何通过注册表来读取QQ的安装路径,适合于初学者学习。

    网络驱动程序设计指南

    第五章 获取和设置WMI的微端口信息及NDIS支持 89 5.1 NDIS管理信息和OID 89 5.2 查询微端口信息 89 5.2.1 无连接微端口的查询 90 5.2.2 面向连接微端口的查询 91 5.3 设置微端口信息 92 5.3.1 为无连接微端口设置...

    vc实例精通源码,windows基本控件的使用Demo

    02_RedirectStdio 用匿名管道获取控制台程序的输出。 03_CatchError 拦截并处理外部进程的错误。 04_SingleInstance 防止应用程序运行多个实例。 05_ProcessMsg 用消息在进程间通讯。 06_MappingFile ...

    ESET_VC52_AUTOID精锐id自动获取器(绝对能用!)

    2、优化“开机启动”,解决打开软件自身开机启动时和安装麦大集成版的开机启动冲突出现两个ID获取一起运行的问题。 1.6.8.6更新:2009-03-29 1、增加一条内置的软件更新检验线路。 2、优化更新线路,解决有时因网站...

    VC学习大纲 VC学习讲义

    对话框用户界面程序的编写,如何向对话框控件联接数据成员及其实现机理,如何向对话框控关联控件类,如何利用对话框类的成员函数向控件发送消息和获取对话框控件的类指针,如何直接利用对话框控件类操纵对话框控件...

    软件名:ESET_VC52_UPID(AUTOID)

    3.8#更换一个获取线路,程序运行时间缩短 3.29#增加排除功能(支持4.2版本) 3.29#实现在线替换更新功能 4.4#更新至4.2.1.2修正排除失败时界面锁定的问题(3.0和2.7版本需自己手动添加排除) 4.8#更新至4.2.1.3修正...

    nod ID 自动获取升级

    1、精睿ESET_VC52_UPID获取器,本工具支持2.7、3.0、4.0、4.2、5.0版本。 2、本工具运行时先验证电脑里ESET的ID(支持所有版本。包括4.2),无效就自动申请ID验证后写入注册表。 3、自我排除功能,当程序首次运行时...

    win2000驱动程序设计指南

    Packet信息 158 9.5 卸载TCP/IP校验和任务 159 9.6 卸载IP安全任务 161 9.7 卸载大TCP包分段 164 9.8 卸载组合 165 9.9 使用注册表键值激活和禁止任务卸载 166 第十章 负载平衡和失效替换 166 ...

    Visual c++案例开发集锦

    觉得可以作为平常的参考,对初学者或许有点帮助吧 内容: 第一章 窗口的动画效果 带有工具栏的对话框 ...注册表编程 第九章 CHM COM编程获取表单域信息 SMTP客户端程序 五子棋游戏 学生成绩管理系统

Global site tag (gtag.js) - Google Analytics