Jump to content


Photo

[MULTILENGUAJE] Conocer la versión de un programa


  • Please log in to reply
6 replies to this topic

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 28 November 2013 - 04:07 AM

Hace tiempo que no publicaba cosillas y se me a ocurrido un sencillo truco que puede ser muy útil tanto para conocer la versión de nuestra propia aplicación como la de cualquiera otra simplemente conociendo el nombre del ejecutable.

Como en otras ocasiones voy a echar mano de la API de Windows:
GetFileVersionInfoSize
GetFileVersionInfo
VerQueryValue

Aquí un ejemplo de código:

delphi
  1. uses
  2.   Windows, ...;
  3.  
  4. type
  5. TVersion = record
  6.   major: DWORD;
  7.   minor: DWORD;
  8.   release: DWORD;
  9.   build: DWORD;
  10. end;
  11.  
  12. implementation
  13.  
  14. function GetVersion(FileName: String; var Version: TVersion): boolean;
  15. var
  16.   dwHandle: DWORD;
  17.   verInfo: PVSFIXEDFILEINFO;
  18.   Data: Pointer;
  19.   verSize, dataSize: DWORD;
  20. begin
  21.   Result:= false;
  22.   ZeroMemory(@Version, sizeof(TVersion));
  23.   dwHandle:= 0;
  24.   dataSize:= GetFileVersionInfoSize(PCHAR(FileName), dwHandle);
  25.   GetMem(Data, dataSize);
  26.   if GetFileVersionInfo(PCHAR(FileName), dwHandle, dataSize, Data) then
  27.   begin
  28.     if VerQueryValue(Data, '\', Pointer(verInfo), verSize) then
  29.     begin
  30.       if verSize > 0 then
  31.       begin
  32.         if verInfo.dwSignature = $FEEF04BD then
  33.         begin
  34.           Version.major:= verInfo.dwFileVersionMS shr 16;
  35.           Version.minor:= verInfo.dwFileVersionMS and $FFFF;
  36.           Version.release:= verInfo.dwFileVersionLS shr 16;
  37.           Version.build:= verInfo.dwFileVersionLS and $FFFF;
  38.           Result:= true;
  39.         end;
  40.       end;
  41.     end;
  42.   end;
  43.   FreeMem(Data);
  44. end;
  45.  
  46. function GetVersionString(FileName: String): String;
  47. var
  48.   Version: TVersion;
  49. begin
  50.   GetVersion(FileName, Version);
  51.   Result:= Format('%d.%d.%d.%d', [Version.major, Version.minor, Version.release, Version.build]);
  52. end;

Un ejemplo de uso para conocer la versión de nuestra propia App:

delphi
  1. Label1.Caption:= GetVersionString(ParamStr(0));


Saludos.
  • 0

#2 seoane

seoane

    Advanced Member

  • Administrador
  • 1259 posts
  • LocationEspaña

Posted 28 November 2013 - 04:23 AM

Eso si utilizas el campo versión del ejecutable, yo por ejemplo tengo la mala costumbre de no hacerlo nunca en mis programas :)

PD: Me alegro de volver a leerte  (b)


  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 28 November 2013 - 06:17 AM

Eso si utilizas el campo versión del ejecutable, yo por ejemplo tengo la mala costumbre de no hacerlo nunca en mis programas :)


Qué razón tienes. Yo en ocasiones hago lo mismo pero no se si es una buena costumbre salirse de los estándares.  :)


PD: Me alegro de volver a leerte  (b)


Lo mismo digo.  (b)


Saludos.
  • 0

#4 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 28 November 2013 - 08:25 AM

Que buen truco amigo escafandra. :) Gracias por compartirlo.
  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 28 November 2013 - 09:57 AM

PD: Me alegro de volver a leerte  (b)


Lo mismo digo.  (b)


¿ Tu también te alegras de leerte amigo escafandra ?

:D :D :D Un mal chiste :p

Yo me alegro de leerlos a los dos :)

Saludos
  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 28 November 2013 - 09:59 AM


Eso si utilizas el campo versión del ejecutable, yo por ejemplo tengo la mala costumbre de no hacerlo nunca en mis programas :)


Qué razón tienes. Yo en ocasiones hago lo mismo pero no se si es una buena costumbre salirse de los estándares.  :)


Yo si suelo colocar la versión y demás yerbas, así como también tengo la costumbre de asignar CodeName's a mis desarrollos ante de sacarlos a la luz.  (h)

Saludos
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 02 December 2013 - 05:10 PM

Ahora le toca a la versión C del truco:


cpp
  1. //---------------------------------------------------------------------------
  2. typedef struct{
  3.   DWORD major;
  4.   DWORD minor;
  5.   DWORD release;
  6.   DWORD build;
  7. } TVersion;
  8.  
  9. bool GetVersion(String FileName, TVersion *Version)
  10. {
  11.   bool Result = false;
  12.   VS_FIXEDFILEINFO *verInfo = 0;
  13.   DWORD dwHandle = 0;
  14.   UINT verSize = 0;
  15.   ZeroMemory(Version, sizeof(TVersion));
  16.   int dataSize = GetFileVersionInfoSize(FileName.c_str(), &dwHandle);
  17.   LPSTR Data = new char[dataSize];
  18.  
  19.   if(GetFileVersionInfo(FileName.c_str(), dwHandle, dataSize, Data)){
  20.     if(VerQueryValue(Data, "\\", (VOID**)&verInfo, &verSize)){
  21.       if(verSize){
  22.         if(verInfo->dwSignature == 0xfeef04bd){
  23.           Version->major = verInfo->dwFileVersionMS >> 16;
  24.           Version->minor = verInfo->dwFileVersionMS & 0xFFFF;
  25.           Version->release = verInfo->dwFileVersionLS >> 16;
  26.           Version->build = verInfo->dwFileVersionLS & 0xFFFF;
  27.           Result = true;
  28.         }
  29.       }
  30.     }
  31.   }
  32.   delete [] Data;
  33.   return Result;
  34. }
  35.  
  36. String GetVersionString(String FileName)
  37. {
  38.   TVersion Version;
  39.   GetVersion(FileName, &Version);
  40.   return Format("%d.%d.%d.%d", ARRAYOFCONST(((int)Version.major, (int)Version.minor, (int)Version.release, (int)Version.build)));
  41. }


Saludos.
  • 0




IP.Board spam blocked by CleanTalk.