获取已经安装软件列表

#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/XP
const GUID IID_IShellAppManager5 = { 0x352EC2B8, 0x8B9A, 0x11D1, 0xB8,0xAE,0x00,0x60,0x08,0x05,0x93,0x82 };
// Windows Vista/7
const 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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值