获取已经安装软件列表

来源:互联网 发布:人工智能主题的基金 编辑:程序博客网 时间:2024/04/28 13:42
#include <stdio.h>#include <tchar.h>#include <windows.h>#include <shlobj.h>#include <shappmgr.h>DECLARE_INTERFACE_(IInstalledApp, IUnknown) {    BEGIN_INTERFACE        virtual HRESULT (STDMETHODCALLTYPE GetAppInfo)(PAPPINFODATA pai);        virtual HRESULT (STDMETHODCALLTYPE GetPossibleActions)(DWORD *pdwActions);        virtual HRESULT (STDMETHODCALLTYPE GetSlowAppInfo)(PSLOWAPPINFO psaid);        virtual HRESULT (STDMETHODCALLTYPE GetCachedSlowAppInfo)(PSLOWAPPINFO psaid);        virtual HRESULT (STDMETHODCALLTYPE IsInstalled)(void);        virtual HRESULT (STDMETHODCALLTYPE Uninstall)(HWND hwnd);        virtual HRESULT (STDMETHODCALLTYPE Modify)(HWND hwndParent);        virtual HRESULT (STDMETHODCALLTYPE Repair)(BOOL bReinstall);        virtual HRESULT (STDMETHODCALLTYPE Upgrade)(void);    END_INTERFACE};DECLARE_INTERFACE_(IEnumInstalledApps, IUnknown) {    BEGIN_INTERFACE        virtual HRESULT (STDMETHODCALLTYPE Next)(IInstalledApp **pia);        virtual HRESULT (STDMETHODCALLTYPE Reset)(void);    END_INTERFACE};typedef struct {    LPWSTR pszCategory;    UINT idCategory;} SHELLAPPCATEGORY, *PSHELLAPPCATEGORY;typedef struct {    UINT cCategories;    SHELLAPPCATEGORY *pCategory;} SHELLAPPCATEGORYLIST, *PSHELLAPPCATEGORYLIST;DECLARE_INTERFACE_(IShellAppManager, IUnknown) {    BEGIN_INTERFACE        virtual HRESULT (STDMETHODCALLTYPE GetNumberofInstalledApps)(DWORD *pdwResult);        virtual HRESULT (STDMETHODCALLTYPE EnumInstalledApps)(IEnumInstalledApps **peia);        virtual HRESULT (STDMETHODCALLTYPE GetPublishedAppCategories)(PSHELLAPPCATEGORYLIST pCategoryList);        virtual HRESULT (STDMETHODCALLTYPE EnumPublishedApps)(LPCWSTR pszCategory, IEnumPublishedApps **ppepa);        virtual HRESULT (STDMETHODCALLTYPE InstallFromFloppyOrCDROM)(HWND hwndParent);    END_INTERFACE};const GUID CLSID_ShellAppManager = { 0x352EC2B7, 0x8B9A, 0x11D1, 0xB8,0xAE,0x00,0x60,0x08,0x05,0x93,0x82 };// Windows 2k/XPconst GUID IID_IShellAppManager5 = { 0x352EC2B8, 0x8B9A, 0x11D1, 0xB8,0xAE,0x00,0x60,0x08,0x05,0x93,0x82 };// Windows Vista/7const GUID IID_IShellAppManager6 = { 0xC257690D, 0x85DE, 0x417C, 0xB9,0x64,0xC2,0x2B,0x1A,0x6B,0xB5,0xF7 };/* main */int main(int argc, char *argv[]){    HRESULT hr = CoInitialize(NULL);    if (SUCCEEDED(hr)) {        IShellAppManager *pisham = NULL;        // 根据系统版本选用适合的 IID_IShellAppManager 值        hr = CoCreateInstance(CLSID_ShellAppManager, NULL, CLSCTX_INPROC_SERVER, IID_IShellAppManager6, (void **)&pisham);        if (SUCCEEDED(hr)) {            IEnumInstalledApps *pieia = NULL;            hr = pisham->EnumInstalledApps(&pieia);            if (SUCCEEDED(hr)) {                IInstalledApp *piia = NULL;                while (SUCCEEDED(pieia->Next(&piia)) && piia != NULL) {                    APPINFODATA appinfo;                    appinfo.cbSize = sizeof(APPINFODATA);                    appinfo.dwMask = AIM_DISPLAYNAME | AIM_VERSION | AIM_PUBLISHER | AIM_PRODUCTID;                    hr = piia->GetAppInfo(&appinfo);                    if (SUCCEEDED(hr)) {                        // appinfo 可用的值取决于 dwMask 的标志位                        // appinfo.pszDisplayName 显示名称                        char szInfo[256];                        WideCharToMultiByte(CP_ACP, 0, appinfo.pszDisplayName, -1, szInfo, 256, NULL, NULL);                        puts(szInfo);                    }                    piia->Release();                    piia = NULL;                }                pieia->Release();            }            pisham->Release();        }        CoUninitialize();    }    return 0;}

缺失的部分是 msi 安装包,这些包并不出现在 Uninstall 这个键值下面,只能用 MsiEnumProducts、MsiGetPatchInfo 系列的函数来取得这些软件包的信息。它们记录在注册表 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products 下面。

http://bbs.csdn.net/topics/390710564

0 0
原创粉丝点击