BCB实现更改外部exe图标(图标来源ICO文件,支持多图片ico)
2009年5月29日
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; } |