引用【可牛科技CEO傅盛http://t.qq.com/keniufusheng】腾讯微博原文“扫盲一下:要知道你装了什么软件,无需扫描硬盘,调用windows的一个系统函数即可,这是windows提供的标准程序接口。”
某不才,小小研究了下,现将研究源码以及结果公示于各位:
以下为源代码 感兴趣的各位可以自己输入验证:
#include <Windows.h>
#include <iostream>
#include <string>
void main()
{
std::string strKey("SOFTWARE//Microsoft//Windows//CurrentVersion//Uninstall//");
HKEY hKey = NULL;
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, strKey.c_str(), 0, KEY_READ, &hKey))
{
char szName[_MAX_PATH] = {0};
DWORD dwNameSize = _MAX_PATH;
int nIdx = 0;
while (ERROR_SUCCESS == RegEnumKeyEx(hKey, nIdx, szName, &dwNameSize, NULL, NULL, NULL, NULL))
{
HKEY hSubKey = NULL;
DWORD dwDataSize =_MAX_FNAME;
char szData[_MAX_FNAME] = {0};
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, (strKey+szName).c_str(), 0, KEY_READ, &hSubKey)
&& ERROR_SUCCESS == RegQueryValueEx(hSubKey, "DisplayName", NULL, NULL, (LPBYTE)szData, &dwDataSize))
{
std::cout<<szData<<std::endl;
RegCloseKey(hSubKey);
}
++nIdx;
dwNameSize = _MAX_PATH;
}
RegCloseKey(hKey);
}
std::cout<<"/n ==================================================";
std::cout<<"/n| 事实证明,获取安装程序不需要扫描硬盘! |";
std::cout<<"/n| by 宝宝 xrgb.studio@gmail.com |";
std::cout<<"/n ==================================================/n";
system("pause");
}
以下为结果,枚举了系统安装过的软件:
开发以及运行环境:
OS : Wnidows 7 Ultimate
IDE: Microsoft Visual Studio 2008(English)
基本原理为:
读取注册表unistall子键 并且枚举就可以得知 并不是扫描硬盘
玩过注册表的同学可以查看该项:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall/
这里就是软件安装/卸载列表,选中其中某项 查看其详细信息。