Jump to content


Photo

Como obtener metadatos de un exe


  • Please log in to reply
2 replies to this topic

#1 JoAnCa

JoAnCa

    Advanced Member

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

Posted 27 July 2023 - 11:44 PM

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
  • 4111 posts
  • LocationMadrid - España

Posted 28 July 2023 - 11:58 AM

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 posts
  • LocationPinar del Río, Cuba

Posted 29 July 2023 - 04:45 PM

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


  • 0




IP.Board spam blocked by CleanTalk.