Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Gráficos
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-12-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Me alegro de que lo consigas. No te olvides de postear tus soluciones, Siempre servirán a mas gente.

Saludos.
Responder Con Cita
  #2  
Antiguo 21-12-2008
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 20
_cero_ Va por buen camino
Thumbs up

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.

Última edición por _cero_ fecha: 21-12-2008 a las 06:21:01.
Responder Con Cita
  #3  
Antiguo 21-12-2008
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Bien _cero_. Ya que entraste en el tema de enumeración de los resources, te dejo esto:

Código:
//------------------------------------------------------------------------------
// Funciones de enumeración de resources
//------------------------------------------------------------------------------
// Declaraciones previas

typedef BOOL (__stdcall *TP)();

struct TResInGr{
   int Count;
   int Id;
   char* ResName;
   HRSRC hRes;
};

// Para la cuenta de elementos encontrar un Resource
BOOL CALLBACK
EnumResGrProc(HANDLE hModule, LPCTSTR lpszType, LPTSTR lpszName, LONG lParam)
{
   TResInGr *Res =  (TResInGr*)lParam;
   if(Res->Count == Res->Id){
     Res->ResName = lpszName;
     Res->hRes = FindResource(hModule, lpszName, lpszType);
   }
   Res->Count++;
   return true;
}

// Devuelve el Nº de Elementos de lpszType
int GetCountRes(HANDLE hModule, LPCTSTR lpszType)
{
   TResInGr Res = {0};
   Res.Id = -1;
   EnumResourceNames(hModule,    lpszType, (TP)EnumResGrProc, LPARAM(&Res));
   return Res.Count;
}

// Devuelve el Nº de Elementos de lpszType
int GetCountRes(char *FuenteExe, LPCTSTR lpszType)
{
   HANDLE hModule = LoadLibrary(FuenteExe);
   int Count = GetCountRes(hModule, lpszType);
   FreeLibrary(hModule);
   return Count;
}

// Devuelve un HRSRC con Indice Id del array de resources lpszType
// Id: Indice del Grupo de iconos como si fuese una array comenzando por 0
HRSRC FindResource(HMODULE hModule, int Id, LPCTSTR lpszType)
{
   TResInGr Res = {0};
   Res.Id = Id;
   EnumResourceNames(hModule,    lpszType, (TP)EnumResGrProc, LPARAM(&Res));
   return Res.hRes;
}
Saludos.


PD:
Una aclaración sobre las funciones que dejé anteriormente. El indice para encontrar el icono, como explico es un indice como si de una matriz se tratara. La Función FindResource que usan no es la API sino una nueva que añado en este post. Siento no haberme dado cuanta hasta ahora que no la había proporcionado, por eso no iban bien los índices. en las funciones posteadas.

Última edición por escafandra fecha: 21-12-2008 a las 14:18:36.
Responder Con Cita
  #4  
Antiguo 21-12-2008
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 20
_cero_ Va por buen camino
Arrow

Pues ya quedo, les dejo el código aquí para que lo descarguen, ya que la solución está formada por tres funciones muy extensas y me pareció mejor subir fuentes que escribir todo el código aquí. Nos vemos y gracias por su ayuda, en especial a escafandra.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
try-except - grandes problemas pmfras Conexión con bases de datos 1 12-06-2007 02:53:33
Obtener iconos para mejorar aspectos zugazua2001 Varios 2 05-08-2006 19:43:45
Grandes frases de grandes personas Nuria Humor 7 18-04-2004 05:40:17
tablas grandes Giniromero Firebird e Interbase 4 14-04-2004 18:18:48


La franja horaria es GMT +2. Ahora son las 23:34:40.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi