Cita:
Empezado por _cero_
así que mi pregunta es de cómo puedo accesar a estas imágenes que están dentro del icono.
|
Quizás esto te pueda ayudar:
Código:
//---------------------------------------------------------------------------
// Devuelve un ResMem Icon de un hModule
// Devuelve el tamaño de la memoria de archivo de un Icono de un hModule
// Retorna 0 si falla, 1 si Buffer==0 y AllSize si devuelve el valor en Buffer.
// Precisa de un Buffer previo de tamaño Size
// Si Buffer = NULL, devuelve en Size el tamaño necesario para el buffer
// Id: Indice del Grupo de iconos como si fuese una array comenzando por 0
int ExtractResIconFromModule(HMODULE hModule, int Id, void* Buffer, int* Size)
{
LPGRPICONDIR grpIconDir;
LPGRPICONDIR grpSrcIconDir;
LPGRPICONDIRENTRY grpIconEntry;
LPICONIMAGE grpIconImage;
LPICONIMAGE resIconImage;
BYTE* IconMem = (BYTE*)Buffer;
HRSRC hRes; // handle para res. info. del ejecutable
int IconsCount = 0;
int AllSize = sizeof(GRPICONDIR);
// Cuento cuantos iconos tiene el recurso y la memoria necesaria
hRes = FindResource(hModule, Id, RT_GROUP_ICON);
if(hRes){
grpSrcIconDir = (LPGRPICONDIR)LoadResource(hModule, hRes);
IconsCount = grpSrcIconDir->idCount;
for(int n=0; n<IconsCount; n++)
AllSize += sizeof(ICONDIRENTRY) + grpSrcIconDir->idEntries[n].dwBytesInRes;
}
if(IconsCount==0){
*Size = 0;
return 0;
}
if(Buffer == 0 ){
*Size = AllSize;
return 1;
}
if(*Size < AllSize) return 0;
// Preparo la Cabecera General grpIconDir
grpIconDir = (LPGRPICONDIR)IconMem;
grpIconDir->idReserved = 0;
grpIconDir->idType = 1;
grpIconDir->idCount = IconsCount;
grpIconEntry = LPMEMICONDIRENTRY(IconMem + sizeof(GRPICONDIR) - sizeof(GRPICONDIRENTRY));
// Localizar el ICON resource en el ejecutable y sus Imagenes.
hRes = NULL;
grpIconImage = (LPICONIMAGE)((BYTE*)grpIconDir + sizeof(GRPICONDIR) + (sizeof(GRPICONDIRENTRY)*(grpIconDir->idCount-1)));
for(int n=0; n<IconsCount; n++){
int nID = grpSrcIconDir->idEntries[n].nID;
hRes = FindResource(hModule, MAKEINTRESOURCE(nID), RT_ICON);
// Preparo las cabeceras Entrada de cada Imagen
resIconImage = (ICONIMAGE*)LoadResource(hModule, hRes);
grpIconEntry[n].bWidth = resIconImage->icHeader.biWidth;
grpIconEntry[n].bHeight = resIconImage->icHeader.biHeight/2;
grpIconEntry[n].bColorCount = NColors(resIconImage->icHeader.biBitCount);
grpIconEntry[n].bReserved = 0;
grpIconEntry[n].wPlanes = 1;
grpIconEntry[n].wBitCount = resIconImage->icHeader.biBitCount;
grpIconEntry[n].dwBytesInRes = SizeofResource(hModule, hRes);
grpIconEntry[n].nID = n;
// Copio la imagen
memcpy(grpIconImage, resIconImage, grpIconEntry[n].dwBytesInRes);
// grpIconImage = (LPICONIMAGE)((BYTE*)grpIconImage + grpIconDir->idEntries[n-1].dwBytesInRes);
grpIconImage = (LPICONIMAGE)((BYTE*)grpIconImage + grpIconEntry[n].dwBytesInRes);
}
return AllSize;
}
o esta otra versión de la misma función:
Código:
//---------------------------------------------------------------------------
// Devuelve un ResMem Icon de un hModule
// Reserva la memoria necesaria y Requiere liberarla luego con
// VirtualFree(Mem, 0, MEM_RELEASE);
// Id: Indice del Grupo de iconos como si fuese una array comenzando por 0
void* ExtractResIconFromModule(HMODULE hModule, int Id)
{
LPGRPICONDIR grpIconDir;
LPGRPICONDIR grpSrcIconDir;
LPGRPICONDIRENTRY grpIconEntry;
LPICONIMAGE grpIconImage;
LPICONIMAGE resIconImage;
HRSRC hRes; // handle para res. info. del ejecutable
int IconsCount = 0;
int AllSize = sizeof(GRPICONDIR);
// Cuento cuantos iconos tiene el recurso y la memoria necesaria
hRes = FindResource(hModule, Id, RT_GROUP_ICON);
if(hRes){
grpSrcIconDir = (LPGRPICONDIR)LoadResource(hModule, hRes);
IconsCount = grpSrcIconDir->idCount;
for(int n=0; n<IconsCount; n++)
AllSize += sizeof(ICONDIRENTRY) + grpSrcIconDir->idEntries[n].dwBytesInRes;
}
if(IconsCount==0) return 0;
// Reservo memoria para la imagen del Icono en memoria
BYTE* IconMem = (BYTE*)VirtualAlloc(0, AllSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
// Preparo la Cabecera General grpIconDir
grpIconDir = (LPGRPICONDIR)IconMem;
grpIconDir->idReserved = 0;
grpIconDir->idType = 1;
grpIconDir->idCount = IconsCount;
grpIconEntry = LPMEMICONDIRENTRY(IconMem + sizeof(GRPICONDIR) - sizeof(GRPICONDIRENTRY));
// Localizar el ICON resource en el ejecutable y sus Imagenes.
hRes = NULL;
grpIconImage = (LPICONIMAGE)((BYTE*)grpIconDir + sizeof(GRPICONDIR) + (sizeof(GRPICONDIRENTRY)*(grpIconDir->idCount-1)));
for(int n=0; n<IconsCount; n++){
int nID = grpSrcIconDir->idEntries[n].nID;
hRes = FindResource(hModule, MAKEINTRESOURCE(nID), RT_ICON);
// Preparo las cabeceras Entrada de cada Imagen
resIconImage = (ICONIMAGE*)LoadResource(hModule, hRes);
grpIconEntry[n].bWidth = resIconImage->icHeader.biWidth;
grpIconEntry[n].bHeight = resIconImage->icHeader.biHeight/2;
grpIconEntry[n].bColorCount = NColors(resIconImage->icHeader.biBitCount);
grpIconEntry[n].bReserved = 0;
grpIconEntry[n].wPlanes = 1;
grpIconEntry[n].wBitCount = resIconImage->icHeader.biBitCount;
grpIconEntry[n].dwBytesInRes = SizeofResource(hModule, hRes);
grpIconEntry[n].nID = n;
// Copio la imagen
memcpy(grpIconImage, resIconImage, grpIconEntry[n].dwBytesInRes);
// grpIconImage = (LPICONIMAGE)((BYTE*)grpIconImage + grpIconDir->idEntries[n-1].dwBytesInRes);
grpIconImage = (LPICONIMAGE)((BYTE*)grpIconImage + grpIconEntry[n].dwBytesInRes);
}
return IconMem;
}
Saludos.