3
嗨,我想知道什么程序安装在我的系统上,我使用MsiEnumProducts和MsiGetProductInfo函数,但不是所有应用程序,我可以在“添加/删除程序”中看到我通过此功能。C++检查已安装的程序
嗨,我想知道什么程序安装在我的系统上,我使用MsiEnumProducts和MsiGetProductInfo函数,但不是所有应用程序,我可以在“添加/删除程序”中看到我通过此功能。C++检查已安装的程序
枚举注册表项:
HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows \ CurrentVersion \卸载
bool EnumInstalledSoftware(void)
{
HKEY hUninstKey = NULL;
HKEY hAppKey = NULL;
WCHAR sAppKeyName[1024];
WCHAR sSubKey[1024];
WCHAR sDisplayName[1024];
WCHAR *sRoot = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
long lResult = ERROR_SUCCESS;
DWORD dwType = KEY_ALL_ACCESS;
DWORD dwBufferSize = 0;
//Open the "Uninstall" key.
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, sRoot, 0, KEY_READ, &hUninstKey) != ERROR_SUCCESS)
{
return false;
}
for(DWORD dwIndex = 0; lResult == ERROR_SUCCESS; dwIndex++)
{
//Enumerate all sub keys...
dwBufferSize = sizeof(sAppKeyName);
if((lResult = RegEnumKeyEx(hUninstKey, dwIndex, sAppKeyName,
&dwBufferSize, NULL, NULL, NULL, NULL)) == ERROR_SUCCESS)
{
//Open the sub key.
wsprintf(sSubKey, L"%s\\%s", sRoot, sAppKeyName);
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, sSubKey, 0, KEY_READ, &hAppKey) != ERROR_SUCCESS)
{
RegCloseKey(hAppKey);
RegCloseKey(hUninstKey);
return false;
}
//Get the display name value from the application's sub key.
dwBufferSize = sizeof(sDisplayName);
if(RegQueryValueEx(hAppKey, L"DisplayName", NULL,
&dwType, (unsigned char*)sDisplayName, &dwBufferSize) == ERROR_SUCCESS)
{
wprintf(L"%s\n", sDisplayName);
}
else{
//Display name value doe not exist, this application was probably uninstalled.
}
RegCloseKey(hAppKey);
}
}
RegCloseKey(hUninstKey);
return true;
}
我想补充的人看到这一点,并遇到错误,您需要启用Unicode的在你的项目属性:在“配置属性”和“常规”下,将参数字符集更改为使用Unicode字符集。 – ComethTheNerd 2014-06-23 21:58:53
这很有趣,因为我从来没有开发过Unicode C++。我为这个例子做过一次这样的事情,因为我认为如果我不这样做,我会遭到批评。 :) – NTDLS 2014-06-27 18:24:56
安装日期如何? – 2014-12-07 20:28:50