2011-04-04 20 views
12

¿Cómo puedo leer los detalles de un archivo exe como la Versión del archivo, la Versión del producto y cualquier otra cosa almacenada en la pestaña Detalles en la ventana Propiedades de ese archivo? Gracias.¿Cómo puedo leer los detalles del archivo?

Respuesta

26

Esto ha sido descrito en About:

Básicamente, sólo tiene que utilizar la función GetFileVersionInfo para obtener los datos y luego VerQueryValue función para leerlo.

Debido a estas funciones de API son un poco 'duro' para usar, he escrito un ejemplo sencillo:

type 
    TEXEVersionData = record 
    CompanyName, 
    FileDescription, 
    FileVersion, 
    InternalName, 
    LegalCopyright, 
    LegalTrademarks, 
    OriginalFileName, 
    ProductName, 
    ProductVersion, 
    Comments, 
    PrivateBuild, 
    SpecialBuild: string; 
    end; 

function GetEXEVersionData(const FileName: string): TEXEVersionData; 
type 
    PLandCodepage = ^TLandCodepage; 
    TLandCodepage = record 
    wLanguage, 
    wCodePage: word; 
    end; 
var 
    dummy, 
    len: cardinal; 
    buf, pntr: pointer; 
    lang: string; 
begin 
    len := GetFileVersionInfoSize(PChar(FileName), dummy); 
    if len = 0 then 
    RaiseLastOSError; 
    GetMem(buf, len); 
    try 
    if not GetFileVersionInfo(PChar(FileName), 0, len, buf) then 
     RaiseLastOSError; 

    if not VerQueryValue(buf, '\VarFileInfo\Translation\', pntr, len) then 
     RaiseLastOSError; 

    lang := Format('%.4x%.4x', [PLandCodepage(pntr)^.wLanguage, PLandCodepage(pntr)^.wCodePage]); 

    if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\CompanyName'), pntr, len){ and (@len <> nil)} then 
     result.CompanyName := PChar(pntr); 
    if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\FileDescription'), pntr, len){ and (@len <> nil)} then 
     result.FileDescription := PChar(pntr); 
    if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\FileVersion'), pntr, len){ and (@len <> nil)} then 
     result.FileVersion := PChar(pntr); 
    if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\InternalName'), pntr, len){ and (@len <> nil)} then 
     result.InternalName := PChar(pntr); 
    if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\LegalCopyright'), pntr, len){ and (@len <> nil)} then 
     result.LegalCopyright := PChar(pntr); 
    if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\LegalTrademarks'), pntr, len){ and (@len <> nil)} then 
     result.LegalTrademarks := PChar(pntr); 
    if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\OriginalFileName'), pntr, len){ and (@len <> nil)} then 
     result.OriginalFileName := PChar(pntr); 
    if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\ProductName'), pntr, len){ and (@len <> nil)} then 
     result.ProductName := PChar(pntr); 
    if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\ProductVersion'), pntr, len){ and (@len <> nil)} then 
     result.ProductVersion := PChar(pntr); 
    if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\Comments'), pntr, len){ and (@len <> nil)} then 
     result.Comments := PChar(pntr); 
    if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\PrivateBuild'), pntr, len){ and (@len <> nil)} then 
     result.PrivateBuild := PChar(pntr); 
    if VerQueryValue(buf, PChar('\StringFileInfo\' + lang + '\SpecialBuild'), pntr, len){ and (@len <> nil)} then 
     result.SpecialBuild := PChar(pntr); 
    finally 
    FreeMem(buf); 
    end; 
end; 

intentarlo. Pero cuidado: actualmente, este solo funciona para en-us EXEs! No funciona para la mayoría de los EXEs en mi máquina sueca, por ejemplo. Es tarde ahora; mañana ampliaré esto para que funcione con cualquier lenguaje EXE, si solo me queda algo de tiempo. [El código About.com tiene el mismo problema, pero ni siquiera pretenden que sea un problema.]

Actualización: El código ahora funciona con cualquier lenguaje EXE.

Sample usage on Connect.exe http://privat.rejbrand.se/verinfo.png
(es-es)

Sample usage on Explorer.exe (Swedish) http://privat.rejbrand.se/verinfo2.png
(sueco)

+0

Muy útil. mi primera fuente de búsqueda fue ABOUT, pero no pude encontrarla, ¡me pregunto por qué! Realmente gracias – Armin

+0

Me sale este error al compilar: "Los tipos de parámetros var reales y formales deben ser idénticos" ¿Dónde está el problema? ¡No hice ningún cambio en las funciones descritas! – Armin

+0

@Armin: Ayudaría si nos dijera en qué línea aparece el error. –

Cuestiones relacionadas