/******************************************************************************/
// 参数定义
/******************************************************************************/
#define ICON_GROUP_MAX 512 //最多列举的图标数
#define ICON_LIST_MAX 32 //每个图标组最多包含的图标数
/******************************************************************************/
//结构定义/******************************************************************************/
typedef struct tagResourceList
{
WORD wCount;
CHAR szName[ICON_GROUP_MAX][MAX_PATH];
}RESOURCELIST, *LPRESOURCELIST;
{
WORD wCount;
CHAR szName[MAX_PATH];
WORD IdList[ICON_LIST_MAX];
}ICONGRP;
typedef struct tagIconList
{
WORD wCount;
ICONGRP Group[ICON_GROUP_MAX];
}ICONLIST, *LPICONLIST;
//*****************************************************************************
// 枚举资源调用函数
// hModule: 文件句柄 lpszType: 资源类型 lpszName:资源名
//*****************************************************************************
BOOL CALLBACK EnumProcedure(HANDLE hModule, LPCTSTR lpszType, LPTSTR lpszName, LONG lParam)
{
WORD wIndex;
DWORD *pValue;
RESOURCELIST *pResList;
pResList = (LPRESOURCELIST)lParam;
wIndex = pResList->wCount;
if(wIndex<ICON_GROUP_MAX)
{
if(HIWORD(lpszName) == 0)
{
// Name is from MAKEINTRESOURCE()
pValue = (DWORD *)(pResList->szName[wIndex]);
*pValue = (DWORD)lpszName;
}
else
{
// Name is string
strcpy(pResList->szName[wIndex], lpszName);
}
pResList->wCount++;
}
return TRUE;
}
//*****************************************************************************
//枚举资源
//*****************************************************************************
BOOL AppResoureList(LPCTSTR szFilePath, LPCTSTR lpszType, LPRESOURCELIST ResoureList)
{
BOOL fgRet = FALSE;
HINSTANCE hLibrary;
//Load the DLL/EXE - NOTE: must be a 32bit EXE/DLL for this to work
hLibrary = LoadLibraryEx(szFilePath, NULL, LOAD_LIBRARY_AS_DATAFILE);
if(hLibrary != NULL)
{
ResoureList->wCount = 0;
fgRet = EnumResourceNames(hLibrary, lpszType, (ENUMRESNAMEPROC)EnumProcedure, (LPARAM)ResoureList);
::FreeLibrary(hLibrary);
}
return fgRet;
}
//*****************************************************************************
//枚举图标资源
//*****************************************************************************
BOOL AppIconList(LPCTSTR szFilePath, LPICONLIST pIconList)
{
BOOL fgRet = FALSE;
HINSTANCE hLibrary;
HRSRC hResSrcDir(NULL);
LPGRPICONDIR lpResDir(NULL) ;
LPTSTR lpszName;
//清零
memset(pIconList, 0, sizeof(ICONLIST));
RESOURCELIST ResoureList;
memset(&ResoureList, 0, sizeof(ResoureList));
//枚举图标资源
hLibrary = LoadLibraryEx(szFilePath, NULL, LOAD_LIBRARY_AS_DATAFILE);
if(hLibrary == NULL) return FALSE;
::EnumResourceNames(hLibrary, RT_GROUP_ICON, (ENUMRESNAMEPROC)EnumProcedure, (LPARAM)(&ResoureList));
//保存图标数量及名称(ID)
pIconList->wCount = ResoureList.wCount;
for(UINT i=0; i<ResoureList.wCount; i++)
{
DWORD dwId = *((DWORD *)ResoureList.szName[i]);
if(HIWORD(dwId) == 0)
{
*((DWORD *)(pIconList->Group[i].szName)) = dwId;
lpszName = MAKEINTRESOURCE(dwId);
}
else
{
lpszName = ResoureList.szName[i];
strcpy(pIconList->Group[i].szName, lpszName);
}
//定位图标资源
hResSrcDir = ::FindResource(hLibrary, lpszName, RT_GROUP_ICON);
if(hResSrcDir == NULL) {::FreeLibrary(hLibrary); return FALSE;}
lpResDir = (LPGRPICONDIR)LoadResource(hLibrary, hResSrcDir);
if(lpResDir == NULL) {::FreeLibrary(hLibrary); return FALSE;}
//保存每个图标ID
pIconList->Group[i].wCount = lpResDir->idCount;
for(UINT j=0; j<lpResDir->idCount; j++)
{
pIconList->Group[i].IdList[j] = lpResDir->idEntries[j].nID;
}
}
::FreeLibrary(hLibrary);
return fgRet;
}
//*****************************************************************************
// 从包含图标资源的文件中删除图标
// lpszApp: 目标文件 nIconIdx:要删除的图标编号,0为删除全部
//*****************************************************************************
BOOL DeleteAppIcon(LPCTSTR lpszApp, UINT nIconIdx)
{
BOOL fgRet = FALSE;
UINT nCount(1);
HANDLE hResource;
DWORD dwId;
LPTSTR lpName;
//得到图标名称
ICONLIST IconList;
AppIconList(lpszApp, &IconList);
if(IconList.wCount == 0) return FALSE;
if(nIconIdx>=IconList.wCount) nIconIdx = 0;
//装入EXE文件,删除图标
hResource = ::BeginUpdateResource(lpszApp, FALSE);
if(hResource == NULL) return FALSE;
if(nIconIdx == 0) nCount = IconList.wCount; else nIconIdx--;
for(UINT i=0; i<nCount; i++, nIconIdx++)
{
//删除图标
for(UINT j=0; j<IconList.Group[i].wCount; j++)
{
::UpdateResource((HMODULE)hResource, RT_ICON, MAKEINTRESOURCE(IconList.Group[i].IdList[j]), MAKELANGID(LANG_CHINESE,SUBLANG_SYS_DEFAULT), NULL, 0);
}
//删除图标组
lpName = IconList.Group[i].szName;
dwId = *((DWORD *)lpName);
if(HIWORD(dwId) == 0) lpName = MAKEINTRESOURCE(dwId);
fgRet = ::UpdateResource((HMODULE)hResource, RT_GROUP_ICON, lpName, MAKELANGID(LANG_CHINESE, SUBLANG_SYS_DEFAULT), NULL, 0);
}
//结束更新
fgRet = ::EndUpdateResource(hResource, FALSE);
return fgRet;
}