存档

文章标签 ‘图标’

BCB实现更改外部exe图标(图标来源ICO文件,支持多图片ico)

2009年5月29日 coolspace 3 条评论

这是很久之前玩杂志打包工具时的副产物,这个是比较原始的一个版本,改进的版本可以支持从exe等文件中提取图标。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <classes.hpp>
#pragma   pack(push,1)
typedef struct ICONDIRENTRY
{
    BYTE bWidth;
    BYTE bHeight;
    BYTE bColorCount;
    BYTE bReserved;
    WORD wPlanes;
    WORD wBitCount;
    DWORD dwBytesInRes;
    DWORD dwImageOffset;
}ICONDIRENTRY;
 
typedef struct ICONDIR
{
    WORD idReserved;
    WORD idType;
    WORD idCount;
}ICONDIR;
typedef struct GRPICONDIRENTRY
{
    BYTE bWidth;
    BYTE bHeight;
    BYTE bColorCount;
    BYTE bReserved;
    WORD wPlanes;
    WORD wBitCount;
    DWORD dwBytesInRes;
    WORD nID;
}GRPICONDIRENTRY ;
 
typedef struct GRPICONDIR
{
    WORD idReserved;
    WORD idType;
    WORD idCount;
    GRPICONDIRENTRY idEntries[];
}GRPICONDIR ,*lGRPICONDIR;
 
#pragma   pack(pop)
AnsiString icongroupname;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "modifyico.h"
bool CALLBACK EnumIconProc(HMODULE hModule,LPCTSTR lpszType,LPTSTR lpszName,LONG lParam)
{
    icongroupname=lpszName;
}
 
 
bool __fastcall changefileicon(AnsiString filename,AnsiString iconfile){
    HMODULE hexe=LoadLibrary(filename.c_str());
    if(NULL==hexe)return false;
    EnumResourceNames(hexe,RT_GROUP_ICON,(ENUMRESNAMEPROC)EnumIconProc,0);
    FreeLibrary(hexe);
    ICONDIR stID;
    ICONDIRENTRY stIDE;
    GRPICONDIR stGID;
    HANDLE hFile;
    DWORD  nGSize, dwReserved;
    HANDLE hUpdate;
    BOOL ret;
    hFile = CreateFile(iconfile.c_str(), GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
       return false;
    }
    ZeroMemory(&stID, sizeof(ICONDIR));
    ret = ReadFile(hFile, &stID, sizeof(ICONDIR), &dwReserved, NULL);
    TList *list=new TList();
    TStringList *sizelist=new TStringList();
    int i=0;
    nGSize= stID.idCount*sizeof(GRPICONDIRENTRY)+6;
    BYTE *GIcondata=new BYTE[nGSize];
    ZeroMemory(GIcondata,nGSize);
    int offset=0;
    *((WORD*)(GIcondata+offset))=0;
    offset+=2;
    *((WORD *)(GIcondata+offset))=1;
    offset+=2;
    *((WORD *)(GIcondata+offset))=stID.idCount;
    offset+=2;
    for (i = 0; i < stID.idCount; i++) {
        ZeroMemory(&stIDE, sizeof(ICONDIRENTRY));
        SetFilePointer(hFile,i*sizeof(ICONDIRENTRY)+sizeof(ICONDIR),NULL,FILE_BEGIN);
        ret = ReadFile(hFile, &stIDE,sizeof(ICONDIRENTRY), &dwReserved, NULL);
        CopyMemory(GIcondata+offset,&stIDE,12);
        *((WORD*)(GIcondata+offset+12))=0x1000+i;
        SetFilePointer(hFile, stIDE.dwImageOffset, NULL, FILE_BEGIN);
        BYTE *icondata=new BYTE[stIDE.dwBytesInRes];
        ret=ReadFile(hFile,(LPVOID)icondata, stIDE.dwBytesInRes, &dwReserved, NULL);
        if(!ret)
        {
            CloseHandle(hFile);
            list->Free();
            delete [] icondata;
            delete []GIcondata;
            sizelist->Free();
            return false;
        }
        list->Add(icondata);
        sizelist->Add(IntToStr(stIDE.dwBytesInRes));
        offset+=sizeof(GRPICONDIRENTRY);
    }
    hUpdate = BeginUpdateResource(filename.c_str(), false);
    ret = UpdateResource(hUpdate, RT_GROUP_ICON, icongroupname.c_str(), GetSystemDefaultLangID(), (LPVOID)GIcondata, nGSize);
    i=0;
    for (i = 0; i < stID.idCount; i++) {
            ret = UpdateResource(hUpdate, RT_ICON, MakeIntResource(0x1000+i), GetSystemDefaultLangID(), (LPVOID)list->Items[i], StrToInt(sizelist->Strings[i].c_str()));
    }
    EndUpdateResource(hUpdate, false);
    if (!ret)
    {
       CloseHandle(hFile);
       list->Free();
       sizelist->Free();
       delete []GIcondata;
       return false;
    }
    CloseHandle(hFile);
    list->Free();
    sizelist->Free();
    delete []GIcondata;
    return true;
}
分类: Computer 标签: , ,