Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Extraer icono de archivo .exe (https://www.clubdelphi.com/foros/showthread.php?t=83915)

Caroso 14-08-2013 14:51:17

Extraer icono de archivo .exe
 
Hola compañeros del foro...
Tengo una consulta si alguien la puede responder... como se puede obtener el icono de un ejecutable (.exe)...
Ya eh intentado aplicar todas las formas que muestran pero todas me devuelven este resultado: 㩃停潲牧浡䘠汩獥䕜卍䥜⁂慍慮敧屲䉉慍慮敧⹲硥e奴皔὚묁쭨%὚묁 en ves del nombre del archivo o ruta del mismo...

Eh probado el ultimo obteniendo el mismo resultado... muchas gracias... Trabajo con Delphi 2010 en Windows 7...

Link: http://www.clubdelphi.com/foros/arch...hp?t-1655.html

Neftali [Germán.Estévez] 14-08-2013 17:24:25

Una cosa es extraer el icono de un ejecutable y otra, extraer o conocer el path de un icono asociado a un tipo de archivo.
¿Exactamente qué es lo que necesitas?

Según el título parece que lo primero, pero según tus comentarios (nombre del archivo o ruta) parece que lo segundo... :confused::confused:

nlsgarcia 14-08-2013 18:38:22

Caroso,

Cita:

Empezado por Caroso
...como se puede obtener el icono de un ejecutable...

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
const
   FileIcons = 'C:\Windows\System32\Shell32.dll';

var
   Icon : TIcon;
   Image : TImage;
   NumberOfIcons, i : Integer;

begin

   Icon := TIcon.Create;
   Image := TImage.Create(Self);

   try

      // Obtiene el número de Icons del archivo
      NumberOfIcons := ExtractIcon(Handle, PChar(FileIcons), UINT(-1));

      // Extrae todos los Icons del archivo y los salva a disco
      for i := 0 to NumberOfIcons - 1  do
      begin
         Icon.Handle := ExtractIcon(Handle, PChar(FileIcons), i);
         Image.Picture.Assign(Icon);
         Image.Picture.SaveToFile(ExtractFilePath(Application.ExeName) + 'Icon-' + IntToStr(i) + '.ico');
      end;

   finally

      Icon.Free;
      Image.Free;

   end;

end;
El código anterior extrae por medio de la API ExtractIcon todos los Icons del archivo referenciado en FileIcons y los salva a disco.

Espero sea útil :)

Nelson.

ecfisa 14-08-2013 23:04:03

Hola Caroso.

Agregando otra opción a la de nlsgarcia, también podes obtener el contenido del ícono de un ejecutable usando la función PrivateExtractIcons.

Ejemplo:
Código Delphi [-]
...
implementation

function PrivateExtractIcons(lpszFile: PChar; nIconIndex, cxIcon, cyIcon: integer;
     phicon: PHANDLE; piconid: PDWORD; nicon, flags: DWORD): DWORD;
     stdcall ; external 'user32.dll' name 'PrivateExtractIconsA';

procedure TForm1.Button1Click(Sender: TObject);
var
 hndIcon : THandle;
 idIcon  : DWORD;
 aIcon   : TIcon;
begin
  if OpenDialog1.Execute then
    if PrivateExtractIcons(PChar(OpenDialog1.FileName),0,16,16,@hndIcon,@idIcon,1,LR_LOADFROMFILE) <> 0 then
    try
      aIcon := TIcon.Create;
      try
        aIcon.Handle := hndIcon;
        aIcon.SaveToFile(ExtractFilePath(OpenDialog1.FileName) + 'EXE_ICON.ICO');
      finally
        aIcon.Free;
      end;
    finally
      DestroyIcon(hndIcon);
    end;
end;
...
Pero como menciona Neftali, no está claro en tu mensaje si lo que deseas obtener es la imágen del ícono o la ruta.
Ahora si lo que buscas es obtener la ruta al archivo .ico que originalmente cargó el ejecutable, la respuesta es: No es posible.

Saludos. :)

nlsgarcia 15-08-2013 00:47:45

Caroso,

Esta es una variante basada en el código de los Msgs #3 y #4:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
   Icon: TIcon;
   OpenDialog : TOpenDialog;

begin

   OpenDialog := TOpenDialog.Create(Self);
   Icon := TIcon.Create;

   if OpenDialog.Execute then
   try

      // Extrae el Primer Icon del Archivo Seleccionado
      Icon.Handle := ExtractIcon(Handle, PChar(OpenDialog.FileName), 0);
      Icon.SaveToFile(ExtractFilePath(Application.ExeName) + 'IconFile' + '.ico');

   finally

      Icon.Free;
      OpenDialog.Free;

   end;

end;
Espero sea útil :)

Nelson.

Caroso 15-08-2013 02:02:55

Muchas gracias
 
Cita:

Empezado por nlsgarcia (Mensaje 465614)
Caroso,

Esta es una variante basada en el código de los Msgs #3 y #4:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
   Icon: TIcon;
   OpenDialog : TOpenDialog;

begin

   OpenDialog := TOpenDialog.Create(Self);
   Icon := TIcon.Create;

   if OpenDialog.Execute then
   try

      // Extrae el Primer Icon del Archivo Seleccionado
      Icon.Handle := ExtractIcon(Handle, PChar(OpenDialog.FileName), 0);
      Icon.SaveToFile(ExtractFilePath(Application.ExeName) + 'IconFile' + '.ico');

   finally

      Icon.Free;
      OpenDialog.Free;

   end;

end;
Espero sea útil :)

Nelson.

Muy bueno el codigo Nelson... muchas gracias me funciona de 10... y Muchas gracias a todos los demás por haber compartido sus conocimientos con los demas... :) un saludo y abrazo

blackx5n 16-08-2013 03:27:56

Hay alguna forma de extraer el icono de cualquier archivo sin que este sea un *.exe

He probado estos ejemplos y funciona pero algunos iconos me salen de color gris, no salen igual al icono original del programa.

Neftali [Germán.Estévez] 16-08-2013 09:14:50

Cita:

Empezado por blackx5n (Mensaje 465649)
Hay alguna forma de extraer el icono de cualquier archivo sin que este sea un *.exe

¿Qué tipo de archivos?
En ese caso, tal vez debas primero acceder a la aplicación asociada por defecto para abrirla y luego extraer el icono asociada a esta.
Por ejemplo, los ficheros .PAS, no contienen icono, pero sí visualizan uno.

Si quieres extraer ese icono debes seguir este procedimiento.

¿Es a esto a lo que te refieres?

blackx5n 16-08-2013 11:52:32

Si me referia a eso, el ejemplo que indicas ilustra perfectamente lo que preguntaba.

Era la duda que tenia por ejemplo si tengo un archivo *.pdf y este tiene un Icono y la aplicacion contiene un Icono diferente al archivo.

Los iconos como el bloc de notas, carpetas, papelera de reciclaje, etc estos estan ligados a un archivo *.dll mas concretamente shell32.dll en el caso de windows 7 y tendria que abrir este archivo dll y extraer los iconos.

Con tu respuesta me aclaras la duda que tenia, gracias Neftali ^\||/


La franja horaria es GMT +2. Ahora son las 17:25:58.

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