Bonsoir,
Je cherche une methode pour modifier l'icone d'une executable a partir d'un programme,
d'abord recuperer les icones d'un fichier ico et les ajouter d'un un exe avec UpdateResource.
Ma fonction ne fonctionne presque pas, voir fait planter l'application.
Merci de vos reponses.
typedef struct {
BYTE bWidth;
BYTE bHeight;
BYTE bColorCount;
BYTE bReserved;
WORD wPlanes;
WORD wBitCount;
DWORD dwBytesInRes;
DWORD dwImageOffset;
} ICONDIRENTRY, *LPICONDIRENTRY;
typedef struct {
WORD idReserved;
WORD idType;
WORD idCount;
ICONDIRENTRY idEntries[1];
} ICONDIR, *LPICONDIR;
#pragma pack(push)
#pragma pack(2)
typedef struct {
BYTE bWidth;
BYTE bHeight;
BYTE bColorCount;
BYTE bReserved;
WORD wPlanes;
WORD wBitCount;
DWORD dwBytesInRes;
WORD nId;
} GRPICONDIRENTRY, *LPGRPICONDIRENTRY;
#pragma pack(pop)
#pragma pack(push)
#pragma pack(2)
typedef struct {
WORD idReserved;
WORD idType;
WORD idCount;
GRPICONDIRENTRY idEntries[1];
} GRPICONDIR, *LPGRPICONDIR;
#pragma pack(pop)
BOOL AddFileIcon(LPSTR szIFileName, LPSTR szEFileName)
{
HANDLE hIcon = CreateFile(szIFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(!hIcon)
return FALSE;
LPBYTE lpBuf;
DWORD dwFileSize, dwBytesRead;
dwFileSize = GetFileSize(hIcon, NULL);
lpBuf = (LPBYTE)malloc(dwFileSize);
if(!lpBuf){
CloseHandle(hIcon);
return FALSE;
}
LPICONDIR lpid = (LPICONDIR) malloc(sizeof(ICONDIR));
if(!lpid) return FALSE;
ReadFile(hIcon, &lpid->idReserved, sizeof(WORD), &dwBytesRead, NULL);
ReadFile(hIcon, &lpid->idType, sizeof(WORD), &dwBytesRead, NULL);
ReadFile(hIcon, &lpid->idCount, sizeof(WORD), &dwBytesRead, NULL);
lpid = (LPICONDIR) realloc(lpid, (sizeof(WORD) * 3) + (sizeof(ICONDIRENTRY) * lpid->idCount));
if(!lpid) return FALSE;
ReadFile(hIcon, &lpid->idEntries[0], sizeof(ICONDIRENTRY) * lpid->idCount, &dwBytesRead, NULL);
LPGRPICONDIR lpgid = (LPGRPICONDIR)malloc(sizeof(GRPICONDIR));
if(!lpgid) return FALSE;
lpgid->idReserved = lpid->idReserved;
lpgid->idType = lpid->idType;
lpgid->idCount = lpid->idCount;
lpgid = (LPGRPICONDIR)realloc(lpgid, (sizeof(WORD) * 3) + (sizeof(GRPICONDIRENTRY) * lpgid->idCount));
if(!lpgid) return FALSE;
for(int i = 0; i < lpgid->idCount; i++){
lpgid->idEntries[i].bWidth = lpid->idEntries[i].bWidth;
lpgid->idEntries[i].bHeight = lpid->idEntries[i].bHeight;
lpgid->idEntries[i].bColorCount = lpid->idEntries[i].bColorCount;
lpgid->idEntries[i].bReserved = lpid->idEntries[i].bReserved;
lpgid->idEntries[i].wPlanes = lpid->idEntries[i].wPlanes;
lpgid->idEntries[i].wBitCount = lpid->idEntries[i].wBitCount;
lpgid->idEntries[i].dwBytesInRes = lpid->idEntries[i].dwBytesInRes;
lpgid->idEntries[i].nId = i + 1;
}
HANDLE hUpdateRes;
hUpdateRes = BeginUpdateResource(szEFileName, TRUE);
for(int i = 0; i < lpid->idCount; i++){
LPBYTE lpBuffer = (LPBYTE)malloc(lpid->idEntries[i].dwBytesInRes);
if(!lpBuffer) return FALSE;
SetFilePointer(hIcon, lpid->idEntries[i].dwImageOffset, NULL, FILE_BEGIN);
ReadFile(hIcon, lpBuffer, lpid->idEntries[i].dwBytesInRes, &dwBytesRead, NULL);
if(!UpdateResourceA(hUpdateRes, RT_ICON, MAKEINTRESOURCE(lpgid->idEntries[i].nId), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), &lpBuffer[0], lpid->idEntries[i].dwBytesInRes)){
free(lpBuf);
free(lpBuffer);
return FALSE;
}
free(lpBuffer);
}
if(!UpdateResourceA(hUpdateRes, RT_GROUP_ICON, MAKEINTRESOURCE(1), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), &lpgid[0], (sizeof(WORD) * 3) + (sizeof(GRPICONDIRENTRY) * lpgid->idCount))){
free(lpBuf);
return FALSE;
}
if(!hUpdateRes){
free(lpBuf);
return FALSE;
}
if(!EndUpdateResource(hUpdateRes, FALSE)){
free(lpBuf);
return FALSE;
}
//free(lpid);
//free(lpgid);
free(lpBuf);
CloseHandle(hIcon);
return TRUE;
}