Cita:
Empezado por _cero_
|
Bueno, no se donde te has "atorado" pero quizás es porque
ExtractResIconFromModule está pensada para mapear un resource en memoria no para salvar archivos. Esto te viene bien para extraer un icono que quieras incluir en un ejecutable pero no para salvar un archivo.ico. No es lo mismo la forma de tratar un resource en memoria que un archivo.ico.
Aquí podrás estudiarlo.
Te dejo mas código que te sirve para lo que pretendes (vas a terminar con mi arsenal
![Stick Out Tongue](http://www.clubdelphi.com/foros/images/smilies/tongue.gif)
):
Para extraer un mapa de memoria del icono en formato archivo.ico
Código:
//------------------------------------------------------------------------------
// Devuelve en Buffer Una imagen de archivo.ico para poder guardar en disco.
// 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.
// 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 GetFileMemIconFromModule(HMODULE hModule, int Id, void* Buffer, int *Size)
{
LPICONDIR IconDir;
LPICONDIRENTRY IconEntry;
LPICONIMAGE resIconImage;
LPGRPICONDIR grpIconDir;
HRSRC hRes; // handle para res. info. del ejecutable
int IconsCount = 0;
int AllSize = sizeof(ICONDIR)-sizeof(ICONDIRENTRY);
DWORD ImageOffset;
// Cuento cuantos iconos tiene el recurso y la memoria necesaria
hRes = FindResource(hModule, Id, RT_GROUP_ICON);
if(hRes){
grpIconDir = (LPGRPICONDIR)LoadResource(hModule, hRes);
IconsCount = grpIconDir->idCount;
for(int n=0; n<IconsCount; n++)
AllSize += sizeof(ICONDIRENTRY) + grpIconDir->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
setmem(Buffer, 0, AllSize);
IconDir = (LPICONDIR)Buffer;
IconDir->idReserved = 0;
IconDir->idType = 1;
IconDir->idCount = IconsCount;
// IconEntry apunta a la entrada del primer icono IconDir->idEntries[0]
// IconEntry = LPICONDIRENTRY(Buffer + sizeof(ICONDIR) - sizeof(ICONDIRENTRY));
IconEntry = &IconDir->idEntries[0];
// Localizar el ICON resource en el ejecutable y sus Imagenes.
hRes = NULL;
ImageOffset = sizeof(ICONDIR) + (sizeof(ICONDIRENTRY)*(IconDir->idCount-1));
for(int n=0; n<IconsCount; n++){
int nID = grpIconDir->idEntries[n].nID;
hRes = FindResource(hModule, MAKEINTRESOURCE(nID), RT_ICON);
resIconImage = (ICONIMAGE*)LoadResource(hModule, hRes);
IconEntry[n].bWidth = resIconImage->icHeader.biWidth;
IconEntry[n].bHeight = resIconImage->icHeader.biHeight/2;
IconEntry[n].bColorCount = NColors(resIconImage->icHeader.biBitCount);
IconEntry[n].bReserved = 0;
IconEntry[n].wPlanes = 1;
IconEntry[n].wBitCount = resIconImage->icHeader.biBitCount;
IconEntry[n].dwBytesInRes = SizeofResource(hModule, hRes);
IconEntry[n].dwImageOffset = ImageOffset;
// Copio la imagen
memcpy((BYTE*)Buffer+ImageOffset, resIconImage, IconEntry[n].dwBytesInRes);
ImageOffset += IconEntry[n].dwBytesInRes;
}
return AllSize;
}
Para extraer y salvar un icono procedente de un exe o dll:
Código:
//------------------------------------------------------------------------------
// Guarda en disco File.ico el grupo de Icono de un exe o dll
// Id: Indice del Grupo de iconos como si fuese una array comenzando por 0
bool SaveResIconToFile(char *FuenteExe, char* DestFileName, int Id)
{
BYTE* Buffer;
int Size;
HMODULE hModule;
hModule = LoadLibrary(FuenteExe);
GetFileMemIconFromModule(hModule, Id, 0, &Size);
Buffer = new BYTE[Size];
int S = GetFileMemIconFromModule(hModule, Id, Buffer, &Size);
if(S==0) return false;
HANDLE hFile = CreateFile(DestFileName, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
unsigned long dwBytesWritten;
if (INVALID_HANDLE_VALUE != hFile){
WriteFile(hFile, Buffer, Size, &dwBytesWritten, NULL);
CloseHandle(hFile);
}
FreeLibrary(hModule);
delete [] Buffer;
return (dwBytesWritten == Size);
}
Saludos.
![Big Grin](http://www.clubdelphi.com/foros/images/smilies/biggrin.gif)