删除可执行文件的图标

/******************************************************************************/
// 参数定义
/******************************************************************************/
#define ICON_GROUP_MAX                           512  //最多列举的图标数
#define ICON_LIST_MAX                            32  //每个图标组最多包含的图标数


/******************************************************************************/

//结构定义

/******************************************************************************/

typedef struct tagResourceList
{
  WORD  wCount;
  CHAR  szName[ICON_GROUP_MAX][MAX_PATH];
}RESOURCELIST, *LPRESOURCELIST;


typedef struct
{
  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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值