#include "Sdk.h"
#include "ShUtils.h"
#include "ComUtils.h"
#include "StringMgr.h"
BOOL
ShGetIconOfApp(
LPCWSTR AppPath,
HICON *Icon,
HICON *IconSm
) {
BOOL Result = FALSE;
HMODULE hSkype = NULL;
HRESULT hr = S_FALSE;
IShellFolder* pDesktop = NULL;
IShellFolder* pFolder = NULL;
WCHAR szFolder[MAX_PATH] = L"";
WCHAR szFile[MAX_PATH] = L"";
LPITEMIDLIST pidlFolder = NULL;
LPITEMIDLIST pidlFile = NULL;
IExtractIcon* pIcon = NULL;
WCHAR szIconFile[MAX_PATH]= L"";
UINT cchMax = MAX_PATH;
int iIndex = 0;
UINT wFlags = 0;
HICON hIcon = NULL;
HICON hIconSm = NULL;
__try {
if(AppPath == NULL
|| wcslen(AppPath) == 0
|| Icon == NULL) {
__leave;
}
PszStringCopy(szFolder,
_countof(szFolder),
AppPath
);
if(!PathRemoveFileSpecW(szFolder)) {
__leave;
}
PszStringCopy(szFile,
_countof(szFile),
AppPath
);
PathStripPathW(szFile);
hr = SHGetDesktopFolder(&pDesktop);
if(FAILED(hr)) {
__leave;
}
hr = IShellFolder_ParseDisplayName(pDesktop,
NULL,
NULL,
szFolder,
NULL,
&pidlFolder,
NULL
);
if(FAILED(hr)) {
__leave;
}
if(pidlFolder == NULL) {
__leave;
}
hr = IShellFolder_BindToObject(pDesktop,
pidlFolder,
NULL,
&IID_IShellFolder,
(void **)&pFolder
);
if(FAILED(hr)) {
__leave;
}
if(pFolder == NULL) {
__leave;
}
hr = IShellFolder_ParseDisplayName(pFolder,
NULL,
NULL,
szFile,
NULL,
&pidlFile,
NULL
);
if(FAILED(hr)) {
__leave;
}
if(pidlFolder == NULL) {
__leave;
}
hr = IShellFolder_GetUIObjectOf(pFolder,
NULL,
1,
&pidlFile,
&IID_IExtractIconW,
NULL,
(void **)&pIcon
);
if(FAILED(hr)) {
__leave;
}
if(pIcon == NULL) {
__leave;
}
hr = IExtractIcon_GetIconLocation(pIcon,
GIL_FORSHELL,
szIconFile,
cchMax,
&iIndex,
&wFlags
);
if(FAILED(hr)) {
__leave;
}
hr = IExtractIcon_Extract(pIcon,
szIconFile,
iIndex,
&hIcon,
NULL,
MAKELONG(64, 64)
);
if(SUCCEEDED(hr)) {
*Icon = hIcon;
}
hr = IExtractIcon_Extract(pIcon,
szIconFile,
iIndex,
NULL,
&hIconSm,
MAKELONG(16, 16)
);
if(SUCCEEDED(hr)) {
*IconSm = hIconSm;
}
Result = TRUE;
}
__finally {
if(pIcon != NULL) {
IExtractIcon_Release(pIcon);
}
if(pidlFile != NULL) {
ILFree(pidlFile);
}
if(pidlFolder != NULL) {
ILFree(pidlFolder);
}
if(pFolder != NULL) {
IShellFolder_Release(pFolder);
}
if(pDesktop != NULL) {
IShellFolder_Release(pDesktop);
}
if(hSkype != NULL) {
FreeLibrary(hSkype);
}
}
return Result;
}