PDA

Ver la Versión Completa : Obtener propiedades de EXE..


n3mohack
13-09-2005, 22:56:00
Estimados..
Ej. necesito obtener las propiedades de los exe's contenidos en una carpeta, especificamente me interesa la versión de cada ejecutable.

¿alguna idea?.. ¿alguna api?...

:) Gracias de antemano.

dec
13-09-2005, 23:09:27
Hola,

Lo siguiente es una adaptación del truco "Obtener la version de tu aplicacion definida desde el IDE Delphi (http://www.q3.nu/trucomania/truco.cgi?76&esp:)" que puede hallarse en TrucoMania (http://www.q3.nu/trucomania/).


function GetExeVersion(exePath: string) : string;
var
Size, Size2: DWord;
Pt, Pt2: Pointer;
begin
if not FileExists(exePath) then Exit;
Size := GetFileVersionInfoSize(PChar (exePath), Size2);
if Size > 0 then
begin
GetMem (Pt, Size);
try
GetFileVersionInfo (PChar (exePath), 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;

n3mohack
14-09-2005, 00:32:53
listoco... me funko!!! grax

CRIS
03-10-2005, 12:07:01
Y para una aplicacion externa??

Como se haria??

Salu2.CRIS.

dec
03-10-2005, 12:18:03
Hola,


Y para una aplicacion externa??

¿Probaste ya si la función de más arriba puede valerte, incluso cuando no hablemos de un "ejecutable Delphi"? ;)

CRIS
03-10-2005, 12:19:55
Con la aplicacion en curso si rula perfectamente, pero yo necesito que me devuelva la version de una aplicacion creada en VB que lleva su info version.

pero esque no se como hacerlo para que me de la info de esa aplicacion.

Salu2. y gracias contestame.

delphi.com.ar
03-10-2005, 14:06:05
Las últimas versiones de Delphi traen en SysUtils la función GetFileVersion, que hace la mitad del trabajo de la función propuesta por Dec.

Con la aplicacion en curso si rula perfectamente...
Me traducen eso por favor :D

Saludos!

dec
03-10-2005, 14:25:11
Hola,


Con la aplicacion en curso si rula perfectamente, pero yo necesito que me devuelva la version de una aplicacion creada en VB que lleva su info version.
¿Tengo que entender que lo probaste con la aplicación creada con Visual Basic y no te funcionó? La función de arriba necesita de la ruta de un ejecutable, ¿probaste con la ruta del ejecutable cuya versión quieres obtener, o sea el que está hecho con Visual Basic? ;)



Con la aplicacion en curso si rula perfectamente...
Pecando tal vez de pedante (nada más lejos de mi intención) creo que podría "traducirse" así: "He probado la función de más arriba pasando a esta como parámetro la ruta del archivo ejecutable de la aplicación que estoy llevando a cabo con Delphi y obtengo la información que se espera perfectamente". Bueno, eso creo, más o menos, que quiere decirse. ;)

CRIS
03-10-2005, 14:50:24
Me funciona solo esto y gracias a los dos por ayudarme.


procedure TForm1.SpeedButton1Click(Sender: TObject);

function GetAppVersion:string;
var
Size, Size2: DWord;
Pt, Pt2: Pointer;
begin
Size := GetFileVersionInfoSize(PChar (ParamStr (0)), Size2);
if Size > 0 then
begin
GetMem (Pt, Size);
try
GetFileVersionInfo (PChar (ParamStr (0)), 0, Size, Pt);
VerQueryValue (Pt, '\', Pt2, Size2);
with TVSFixedFileInfo (Pt2^) do
begin
Result:= ' Ver '+
IntToStr (HiWord (dwFileVersionMS)) + '.' +
IntToStr (LoWord (dwFileVersionMS)) + '.' +
IntToStr (HiWord (dwFileVersionLS)) + '.' +
IntToStr (LoWord (dwFileVersionLS));
end;
finally
FreeMem (Pt);
end;
end;
end;

begin
label1.Caption:=GetAppVersion;
end;

CRIS
03-10-2005, 15:08:32
Solucionado gracias miles.


function GetFileVersion( AFileName : String ) : string;
var
Size,
Size2 : DWord;
Pt,
Pt2 : Pointer;
begin
Size := GetFileVersionInfoSize(PChar(AFileName), Size2);
if Size > 0 then
begin
GetMem(Pt, Size);
try
GetFileVersionInfo (PChar(AFileName), 0, Size, Pt);
VerQueryValue (Pt, '', Pt2, Size2);
with TVSFixedFileInfo (Pt2^) do
Result:= Format('Versión %d.%d.%d.%d', [ HiWord(dwFileVersionMS),
LoWord(dwFileVersionMS),
HiWord(dwFileVersionLS),
LoWord(dwFileVersionLS)] );
finally
FreeMem (Pt);
end;
end;
end;

{$R *.dfm}

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
label1.Caption := GetFileVersion( 'C:\cris\gp4champ.exe' );

end;

end.

CRIS
06-10-2005, 17:33:18
Y si queremos pedirle descripcion, compañia y demas cosas??? como se haria.

Salu2.CRIS.

CRIS
08-10-2005, 02:34:38
Lo tengo casi solucionado el problema es que me da la descripcion y demas datos del archivo pero solo del archivo que lleva este codigo, no se como decirle una ruta para que lea los datos del archivo que yo quiera.


function GetAppInfo(De:string):string;

{Se pueden pedir los siguientes datos:
CompanyName
FileDescription
FileVersion
InternalName
LegalCopyright
OriginalFilename
ProductName
ProductVersion
}

type
PaLeerBuffer = array [0..MAX_PATH] of char;

var
Size, Size2 : DWord;
Pt, Pt2 : Pointer;
Idioma : string;

begin
Result:='';
Size := GetFileVersionInfoSize(PChar (Application.Exename), Size2);
if Size > 0 then
begin
GetMem (Pt, Size);
GetFileVersionInfo (PChar (ParamStr (0)), 0, Size, Pt);
{Obtenemos la cadena de translacion, requerida para obtener el resto
de datos del Versioninfo}
VerQueryValue( Pt, '\VarFileInfo\Translation',Pt2, Size2);
Idioma:=IntToHex( DWord(Pt2^) ,8 );
{Le damos la vuelta (Es windows, que quieres...}
Idioma:=Copy(Idioma,5,4)+Copy(Idioma,1,4);

{Pedimos la info requerida...}
VerQueryValue( Pt,
Pchar('\StringFileInfo\'+
Idioma+'\'+
De),
Pt2, Size2);
if Size2 > 0 then
begin
{Y la devolvemos}
Result:=Copy(PaLeerBuffer(Pt2^),1,Size2);
end else
raise Exception.Create( 'No existe esa informacion en este ejecutable'+
#13+
'There are not this info in this executable');
FreeMem (Pt);
end else
raise exception.Create ( 'Lo siento, no hay VersionInfo disponible '+
'en este ejecutable.'+#13+
'Sorry there are not VersionInfo available'+
'in this executable.');
end;
{$R *.dfm}

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
label1.Caption := GetAppInfo ('FileDescription');
end;




Sabeis como y donde poner la ruta del archivo??

Salu2.CRIS.

dec
09-10-2005, 07:34:52
Hola,

Sustituye en el código tanto "Application.ExeName" como "ParamStr(0)" por la ruta del archivo de que quieras obtener la información. Podrías, en todo caso, tratar de adaptar el código de forma que pudieras llamar a la función indicando la ruta del ejecutable en cuestión, así como la información que precises obtener. De otra manera te será, en mi opinión, complicado utilizar dicho código.

dec
09-10-2005, 09:27:03
Hola,

CRIS, preparé en base al código de más arriba un sencillo componente que tal vez pueda resultar de tu interés, o, a lo menos, ofrecerte alguna idea. Lo encontrarás dentro del paquete "DecComp" que puedes encontrar aquí mismo (http://dec.clubdelphi.com/). Le llamé "TInfoExe" y en su código fuente te mencioné a modo de agradecimiento por darme la idea para llevarlo a cabo. :p

CRIS
09-10-2005, 13:52:37
Muchas gracias lo pruebo en un rato y te cuento.

Salu2.CRIS.

CRIS
10-10-2005, 15:09:11
Un millon de gracias dec, es justo lo que necesitaba pero no pense que te ibas a molestar hasta el punto de llegar a montar un componente para mi, aunque seguro que ahora hay gente que lo agracede ya que es verdaderamente una pasada, le pides todo lo que quieras al fichero y te lo da.

Un millon de gracias de nuevo, muy agradecido.

pd. gracias tambien por nombrarme en el componente.

Salu2.CRIS.

viveba
22-09-2012, 18:41:01
Hola Dec, tal vez sea tarde ya para seguir este tema, pero estoy interesado en el componente que comentás, y no puedo encontrarlo, si aún existe te agradecería mucho me digas cómo puedo acceder a él.

Gracias de antemano.

juanlaplata
27-09-2012, 00:02:44
Lo puedes encontrar en el FTP dentro de un conjunto de componentes deccomp.zip
(http://terawiki.clubdelphi.com/Delphi/Componentes-Funciones/?download=deccomp.zip)

viveba
27-09-2012, 06:42:50
Muchas gracias juanlaplata, ya lo descargo