16,471
社区成员
发帖
与我相关
我的任务
分享
#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;
}