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;
} |