PDA

Ver la Versión Completa : Extraer icono de archivo .exe


Caroso
14-08-2013, 14:51:17
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/archive/index.php?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,


...como se puede obtener el icono de un ejecutable...



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 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms648075(v=vs.85).aspx).

Ejemplo:

...
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:

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
Caroso,

Esta es una variante basada en el código de los Msgs #3 y #4:

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
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 ^\||/