Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Obtener propiedades de EXE.. (https://www.clubdelphi.com/foros/showthread.php?t=25148)

n3mohack 13-09-2005 22:56:00

Obtener propiedades de EXE..
 
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" que puede hallarse en TrucoMania.

Código Delphi [-]
 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,

Cita:

Empezado por CRIS
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.

Cita:

Empezado por CRIS
Con la aplicacion en curso si rula perfectamente...

Me traducen eso por favor :D

Saludos!

dec 03-10-2005 14:25:11

Hola,

Cita:

Empezado por CRIS
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? ;)


Cita:

Empezado por Federico
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.

Código Delphi [-]
 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.

Código Delphi [-]
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.

Código Delphi [-]
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. 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

sobre el componente TInfoExe
 
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

viveba 27-09-2012 06:42:50

Muchas gracias juanlaplata, ya lo descargo


La franja horaria es GMT +2. Ahora son las 07:31:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi