Ir al contenido


Foto

Como obtener metadatos de un exe


  • Por favor identifícate para responder
2 respuestas en este tema

#1 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 27 julio 2023 - 11:44

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


  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 28 julio 2023 - 11:58

Con la cadena '\StringFileInfo\040904B0\ProductName' asumes que el idioma es inglés de Estados Unidos (040904B0). Por eso no te funciona siempre.

Debes encontrar el código para el idioma de la aplicación que deseas.
 
En el siguiente ejemplo te muestro como hacerlo y obtener el nombre del producto, si está definido.

 


delphi
  1. type
  2. TTranslate = record
  3. wLanguage: WORD;
  4. wCodePage: WORD;
  5. end;
  6. PTranslate = ^TTranslate;
  7.  
  8.  
  9. implementation
  10.  
  11. function GetProductName(FileName: String): String;
  12. var
  13.   dwHandle: DWORD;
  14.   Data: Pointer;
  15.   verSize, dataSize: DWORD;
  16.   Translate: PTranslate;
  17.   QueryStr:  String;
  18.   Name: PCHAR;
  19. begin
  20.   dwHandle:= 0;
  21.   dataSize:= GetFileVersionInfoSize(PCHAR(FileName), dwHandle);
  22.   GetMem(Data, dataSize);
  23.   if GetFileVersionInfo(PCHAR(FileName), dwHandle, dataSize, Data) then
  24.   begin
  25.     if VerQueryValue(Data, '\VarFileInfo\Translation', Pointer(Translate), verSize) then
  26.     begin
  27.       if verSize > 0 then
  28.       begin
  29.         QueryStr:= IntToHex(Translate.wLanguage, 4) + IntToHex(Translate.wCodePage, 4);
  30.         QueryStr:= Format('\StringFileInfo\%S\ProductName', [QueryStr]);
  31.         if VerQueryValue(Data, PCHAR(QueryStr), Pointer(Name), verSize) then
  32.           Result:= Name;
  33.       end;
  34.    end;
  35.   end;
  36.   FreeMem(Data);
  37. end;

Saludos.


  • 0

#3 JoAnCa

JoAnCa

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 775 mensajes
  • LocationPinar del Río, Cuba

Escrito 29 julio 2023 - 04:45

Muchas gracias por tu respuesta, ya funciona bien en todos los casos


  • 0




IP.Board spam blocked by CleanTalk.