Pues regreso para reportar mis avances y dejarles esta nueva función, en parte basada en las funciones que nos proporciono amablemente escafandra, solo que esta recorre todos los recursos del tipo icono y con un contador(numme), que es el que se encarga de identificar el icono que deseo extraer.
Código:
bool CALLBACK ResNameProc(HANDLE hModule, LPCTSTR lpType,LPTSTR lpszName,LONG lpName)
{
if (numme==0) {
HRSRC hRsrc = FindResource( hModule, MAKEINTRESOURCE(lpszName), lpType );
HGLOBAL hGroup = LoadResource( hModule, hRsrc );
GRPICONDIR * lpGrpIconDir = (LPGRPICONDIR)LockResource( hGroup );
for( int i=0; i < lpGrpIconDir->idCount; ++i ) {
int x = (i%7)*64;
int y = (i/8)*64;
GRPICONDIRENTRY * e = &lpGrpIconDir->idEntries[i];
hRsrc = FindResource( hModule, MAKEINTRESOURCE( e->nID ), RT_ICON );
HGLOBAL hGlobal = LoadResource( hModule, hRsrc );
ICONIMAGE *lpIconImage = (LPICONIMAGE)LockResource( hGlobal );
HICON hicon = CreateIconFromResourceEx(
(PBYTE)lpIconImage,
e->dwBytesInRes,
TRUE,
0x00030000,//DWORD dwVersion,
e->bWidth,
e->bHeight,
0
);
TIcon *icon = new TIcon;
icon->Handle = hicon;
if (icon->Width==256) {
lolol++; icon->SaveToFile("C:\\ico"+String(numme)+".ico");
}
};
}
return true;
}
Y se manda a llamar así
Código:
HMODULE hModule=LoadLibrary("C:\\ShowTime.exe");
EnumResourceNames(hModule,RT_GROUP_ICON,(ENUMRESNAMEPROC)ResNameProc,0);
FreeLibrary(hModule);
Como ven es muy similar a “
EnumProcesses” lo que me facilito mas comprenderla, aunque en lo personal me gustaban mas las otras funciones solo que nunca pude extraer el icono según su posición, porque simplemente no me encontraba el icono o me marcaba que tenia mas imágenes de las que en realidad tenia. pero por si les sirve, para buscar por índice de recursos con “FindResource” solo se pone así
Código:
FindResource(hModule,
"#1", // 1=posición en recursos (índice)
RT_ICON);
Bueno subiré la función completa(cuando la termine al 100), para extraer iconos de extensiones en alta resolución.