zoukankan      html  css  js  c++  java
  • 修改可执行程序图标

    • 方法一
      1 #pragma pack(push, 2)
      2 typedef struct 
      3 {
      4   WORD Reserved1;       // reserved, must be 0
      5   WORD ResourceType;    // type is 1 for icons
      6   WORD ImageCount;      // number of icons in structure (1)
      7   BYTE Width;           // icon width (32)
      8   BYTE Height;          // icon height (32)
      9   BYTE Colors;          // colors (0 means more than 8 bits per pixel)
     10   BYTE Reserved2;       // reserved, must be 0
     11   WORD Planes;          // color planes
     12   WORD BitsPerPixel;    // bit depth
     13   DWORD ImageSize;      // size of structure
     14   WORD ResourceID;      // resource ID
     15 } GROUPICON;
     16 #pragma pack(pop)
     17 
     18 //int CSysInfoHelper::ModifyExeIcon(char *Where, char *What)
     19 int CSysInfoHelper::ModifyExeIcon(const CString &exeName, const CString &iconName)
     20 {
     21   HANDLE hExeNameHandle = NULL;
     22   char *pReadBuffer = NULL;
     23 
     24   int result = -1;
     25 
     26   do 
     27   {
     28     hExeNameHandle = BeginUpdateResource(exeName, FALSE);
     29     if (NULL == hExeNameHandle)
     30     {
     31       break;
     32     }
     33 
     34     CFile srcFile;
     35     BOOL flag = srcFile.Open(iconName, CFile::modeRead | CFile::typeBinary);
     36     if (!flag)
     37     {
     38       break;
     39     }
     40 
     41     UINT readNum = (UINT)srcFile.GetLength();
     42     if (0 == readNum)
     43     {
     44       srcFile.Close();
     45       break;
     46     }
     47 
     48     pReadBuffer = new char[readNum];
     49     if (NULL == pReadBuffer)
     50     {
     51       srcFile.Close();
     52       break;
     53     }
     54 
     55     int num = srcFile.Read(pReadBuffer, readNum);
     56     if (num != readNum)
     57     {
     58       srcFile.Close();
     59       break;
     60     }
     61 
     62     srcFile.Close();
     63 
     64     flag = UpdateResource(hExeNameHandle, // Handle to executable
     65                           RT_ICON, // Resource type - icon
     66                           MAKEINTRESOURCE(1), // Make the id 1
     67                           MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), // Default language
     68                           (pReadBuffer + 22), // skip the first 22 bytes because this is the  icon header
     69                                               // and directory entry (if the file  contains multiple
     70                                               // images, the directory entries will be larger than 22 bytes)
     71                           readNum - 22); // length of buffer
     72 
     73     if (!flag)
     74     {
     75       break;
     76     }
     77 
     78     // Again, we use this structure for educational purposes.
     79     // The icon header and directory entries can be read from the file.
     80     GROUPICON grData;
     81 
     82     // This is the header
     83     grData.Reserved1 = 0;     // reserved, must be 0
     84     grData.ResourceType = 1;  // type is 1 for icons
     85     grData.ImageCount = 1;    // number of icons in structure (1)
     86 
     87     // This is the directory entry
     88     grData.Width        = 32;              // icon width (32)
     89     grData.Height       = 32;              // icon height (32)
     90     grData.Colors       = 0;               // colors (256)
     91     grData.Reserved2    = 0;               // reserved, must be 0
     92     grData.Planes       = 2;               // color planes
     93     grData.BitsPerPixel = 32;              // bit depth
     94     grData.ImageSize    = readNum - 22;    // size of image
     95     grData.ResourceID   = 1;               // resource ID is 1
     96 
     97     flag = UpdateResource(hExeNameHandle,
     98                           RT_GROUP_ICON, // RT_GROUP_ICON resources contain information about stored icons
     99                           L"MAINICON", // MAINICON contains information about the application's displayed icon
    100                           MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT),
    101                           &grData, // Pointer to this structure
    102                           sizeof(GROUPICON));
    103 
    104     if (!flag)
    105     {
    106       break;
    107     }
    108 
    109     result = 1;
    110 
    111   } while (false);
    112 
    113   if (pReadBuffer != NULL)
    114   {
    115     delete []pReadBuffer;
    116   }
    117 
    118   if (hExeNameHandle != NULL)
    119   {
    120     EndUpdateResource(hExeNameHandle, FALSE);
    121   }
    122 
    123   return result;
    124 }
    • 方法二(这个结构更清晰)
      1 struct ICONDIRENTRY
      2 {
      3   BYTE bWidth;
      4   BYTE bHeight;
      5   BYTE bColorCount;
      6   BYTE bReserved;
      7   WORD wPlanes;
      8   WORD wBitCount;
      9   DWORD dwBytesInRes;
     10   DWORD dwImageOffset;
     11 };
     12 
     13 
     14 struct ICONDIR
     15 {
     16   WORD idReserved;
     17   WORD idType;
     18   WORD idCount;
     19   //ICONDIRENTRY idEntries;
     20 };
     21 
     22 
     23 
     24 struct GRPICONDIRENTRY
     25 {
     26   BYTE bWidth;
     27   BYTE bHeight;
     28   BYTE bColorCount;
     29   BYTE bReserved;
     30   WORD wPlanes;
     31   WORD wBitCount;
     32   DWORD dwBytesInRes;
     33   WORD nID;
     34 };
     35 
     36 struct GRPICONDIR
     37 {
     38   WORD idReserved;
     39   WORD idType;
     40   WORD idCount;
     41   GRPICONDIRENTRY idEntries;
     42 };
     43 
     44 
     45 int CSysInfoHelper::ChangeExeIcon(LPCTSTR IconFile, LPCTSTR ExeFile)
     46 {
     47   ICONDIR stID;
     48   ICONDIRENTRY stIDE;
     49   GRPICONDIR stGID;
     50   HANDLE hFile;
     51   DWORD nSize, nGSize, dwReserved;
     52   HANDLE hUpdate = NULL;
     53   PBYTE pIcon = NULL;
     54   PBYTE pGrpIcon = NULL;
     55   BOOL ret;
     56 
     57   int result = -1;
     58 
     59   do 
     60   {
     61     hFile = CreateFile(IconFile, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     62     if (hFile == INVALID_HANDLE_VALUE)
     63     {
     64       break;
     65     }
     66 
     67     ZeroMemory(&stID, sizeof(ICONDIR));
     68     ret = ReadFile(hFile, &stID, sizeof(ICONDIR), &dwReserved, NULL);
     69     if (!ret)
     70     {
     71       break;
     72     }
     73 
     74     ZeroMemory(&stIDE, sizeof(ICONDIRENTRY));
     75     ret = ReadFile(hFile, &stIDE, sizeof(ICONDIRENTRY), &dwReserved, NULL);
     76     if (!ret)
     77     {
     78       break;
     79     }
     80 
     81     nSize = stIDE.dwBytesInRes;
     82     pIcon = new BYTE[nSize];
     83     if (NULL == pIcon)
     84     {
     85       break;
     86     }
     87     SetFilePointer(hFile, stIDE.dwImageOffset, NULL, FILE_BEGIN);
     88     ret = ReadFile(hFile, (LPVOID)pIcon, nSize, &dwReserved, NULL);
     89     if (!ret)
     90     {
     91       break;
     92     }
     93 
     94     ZeroMemory(&stGID, sizeof(GRPICONDIR));
     95     stGID.idCount = stID.idCount;
     96     stGID.idReserved = 0;
     97     stGID.idType = 1;
     98     CopyMemory(&stGID.idEntries, &stIDE, 12);
     99     stGID.idEntries.nID = 0;
    100 
    101     nGSize = sizeof(GRPICONDIR);
    102     pGrpIcon = new BYTE[nGSize];
    103     if (NULL == pGrpIcon)
    104     {
    105       break;
    106     }
    107     CopyMemory(pGrpIcon, &stGID, nGSize);
    108 
    109     hUpdate = BeginUpdateResource(ExeFile, false);
    110     if (NULL == hUpdate)
    111     {
    112       break;
    113     }
    114 
    115     ret = UpdateResource(hUpdate, RT_GROUP_ICON, MAKEINTRESOURCE(1), 0, (LPVOID)pGrpIcon, nGSize);
    116     if (!ret)
    117     {
    118       break;
    119     }
    120 
    121     ret = UpdateResource(hUpdate, RT_ICON, MAKEINTRESOURCE(1), 0, (LPVOID)pIcon, nSize);
    122     if (!ret)
    123     {
    124       break;
    125     }
    126 
    127     result = 1;
    128 
    129   } while (false);
    130 
    131   if (hFile != INVALID_HANDLE_VALUE)
    132   {
    133     CloseHandle(hFile);
    134   }
    135 
    136   if (pIcon != NULL)
    137   {
    138     delete []pIcon;
    139   }
    140 
    141   if (pGrpIcon != NULL)
    142   {
    143     delete []pGrpIcon;
    144   }
    145 
    146   if (hUpdate != NULL)
    147   {
    148     EndUpdateResource(hUpdate, false);
    149   }
    150 
    151   return result;
    152 } 
  • 相关阅读:
    【BZOJ】2019: [Usaco2009 Nov]找工作(spfa)
    【BZOJ】3668: [Noi2014]起床困难综合症(暴力)
    Redis 字符串结构和常用命令
    Redis实现存取数据+数据存取
    Spring 使用RedisTemplate操作Redis
    使用 java替换web项目的web.xml
    SQL server 从创建数据库到查询数据的简单操作
    SQL server 安装教程
    IntelliJ IDEA 注册码(因为之前的地址被封杀了,所以换了个地址)
    对程序员有帮助的几个非技术实用链接(点我,你不会后悔的)
  • 原文地址:https://www.cnblogs.com/spriteflk/p/4513826.html
Copyright © 2011-2022 走看看