PDA

Ver la Versión Completa : Como obtener metadatos de un exe


JoAnCa
28-07-2023, 07:51:03
Hola a todos

Quisiera obtener los metadatos de un archivo .exe, en especifico el Nombre del Producto y la version.

Estoy usando delphi XE7, probé algunas soluciones que encontré:

- Con TFileVersionInfo, pero no funcionan en XE7

- Con:

...
GetFileVersionInfo(PChar(FileName), 0, InfoSize, VerInfo)
...
VerQueryValue(VerInfo, '\StringFileInfo\040904B0\ProductName', Pointer(VerValue), VerValueSize)
...

pero no funciona en todos los casos

Alguien tiene alguna solucion que funcione en todos los casos

Neftali [Germán.Estévez]
28-07-2023, 09:41:19
Esto lo había mirado hace tiempo:
https://www.ajpdsoft.com/modules.php?name=Downloads&d_op=viewdownloaddetails&lid=127

Está la explicación y puedes descargar código fuente y un proyecto que te obtiene esta información (a ver si es lo necesitas) :

https://i.imgur.com/a9nOyah.png

Lo he probado en Delphi 11 y funciona perfectamente.

Neftali [Germán.Estévez]
28-07-2023, 09:42:42
pero no funciona en todos los casos



Habría que saber qué casos son los que no te funcionan.

identsoft
28-07-2023, 09:48:47
Si lo que quieres es ver la versión del ejecutable, te pongo una función que devuelve dicha versión.
Esta función, creo que la saqué del club delphi ( o de alguno de sus miembros).
Hay que pasarle como parámetro la ruta donde esté el ejecutable.


function TfrmMain.VersionExe(const ruta: string) : string;
var
Pt, Pt2: Pointer;
Size, Size2: DWord;
ruta_aux : string;
begin
Result := '';
ruta_aux := ruta + 'NOMBRE DEL EJECUTABLE.EXE';
if not FileExists(ruta_aux) then Exit;
Size := GetFileVersionInfoSize(PChar(ruta_aux), Size2);
if (Size > 0) then begin
GetMem(Pt, Size);
try
GetFileVersionInfo(PChar(ruta_aux), 0, Size, Pt);
VerQueryValue (Pt, '\', Pt2, Size2);
with TVSFixedFileInfo (Pt2^) do begin
Result :=
IntToStr(HiWord(dwFileVersionMS))+'.'+
IntToStr(LoWord(dwFileVersionMS))+'.'+
IntToStr(HiWord(dwFileVersionLS))+'.'+
IntToStr(LoWord(dwFileVersionLS));
end;
finally
FreeMem(Pt);
end;
end;
end;


Espero que te sirva
Saludos

JoAnCa
28-07-2023, 17:02:14
;552180']Esto lo había mirado hace tiempo:
https://www.ajpdsoft.com/modules.php?name=Downloads&d_op=viewdownloaddetails&lid=127

Está la explicación y puedes descargar código fuente y un proyecto que te obtiene esta información (a ver si es lo necesitas) :

https://i.imgur.com/a9nOyah.png

Lo he probado en Delphi 11 y funciona perfectamente.

Muchas gracias por la respuesta.
Ahora que lo veo, recuerdo que una vez tambien lo habia visto, pero parece que mi memoria ya no esta buena jejeje :D

JoAnCa
28-07-2023, 17:06:11
Si lo que quieres es ver la versión del ejecutable, te pongo una función que devuelve dicha versión.
Esta función, creo que la saqué del club delphi ( o de alguno de sus miembros).
Hay que pasarle como parámetro la ruta donde esté el ejecutable.


function TfrmMain.VersionExe(const ruta: string) : string;
var
Pt, Pt2: Pointer;
Size, Size2: DWord;
ruta_aux : string;
begin
Result := '';
ruta_aux := ruta + 'NOMBRE DEL EJECUTABLE.EXE';
if not FileExists(ruta_aux) then Exit;
Size := GetFileVersionInfoSize(PChar(ruta_aux), Size2);
if (Size > 0) then begin
GetMem(Pt, Size);
try
GetFileVersionInfo(PChar(ruta_aux), 0, Size, Pt);
VerQueryValue (Pt, '\', Pt2, Size2);
with TVSFixedFileInfo (Pt2^) do begin
Result :=
IntToStr(HiWord(dwFileVersionMS))+'.'+
IntToStr(LoWord(dwFileVersionMS))+'.'+
IntToStr(HiWord(dwFileVersionLS))+'.'+
IntToStr(LoWord(dwFileVersionLS));
end;
finally
FreeMem(Pt);
end;
end;
end;


Espero que te sirva
Saludos

Gracias por la respuesta, para la version tambien me sirve, pero tambien necesito el nombre del producto.

JoAnCa
28-07-2023, 17:13:36
;552181']Habría que saber qué casos son los que no te funcionan.

En los metodos que probé, que decia que no funcionaba siempre, en los que no devolvia nada fueron en estos archivos exe que probé:
draw.io, adobe acrobat y WPS

Con la solucion que me diste de AjpdSoft, funciona en todos los casos que probé

JoAnCa
28-07-2023, 17:25:51
Revisando el codigo de AjpdSoft, veo el por que no me funcionaba el codigo que yo tenia.
El problema esta en el idioma, que en mi codigo estaba fijo, y si no coincidia con el del archivo, no daba ningun resultado.

En el codigo de AjpdSoft, se usa el mismo metodo, pero se obtiene el idioma del archivo primero, para despues poder pasarselo como parametro, y asi el idioma sera el correcto.

Neftali [Germán.Estévez]
31-07-2023, 08:30:12
En el codigo de AjpdSoft, se usa el mismo metodo, pero se obtiene el idioma del archivo primero, para despues poder pasarselo como parametro, y asi el idioma sera el correcto.


^\||/^\||/^\||/^\||/^\||/