Ir al contenido


Foto

[MULTILENGUAJE] Conocer la versión de un programa


  • Por favor identifícate para responder
6 respuestas en este tema

#1 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.965 mensajes
  • LocationMadrid - España

Escrito 28 noviembre 2013 - 04:07

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
  • 1.257 mensajes
  • LocationEspaña

Escrito 28 noviembre 2013 - 04:23

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

  • Moderadores
  • PipPipPip
  • 3.965 mensajes
  • LocationMadrid - España

Escrito 28 noviembre 2013 - 06:17

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
  • 4.945 mensajes
  • LocationMéxico

Escrito 28 noviembre 2013 - 08:25

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

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.187 mensajes
  • LocationMéxico

Escrito 28 noviembre 2013 - 09:57

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
  • 14.187 mensajes
  • LocationMéxico

Escrito 28 noviembre 2013 - 09:59


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

  • Moderadores
  • PipPipPip
  • 3.965 mensajes
  • LocationMadrid - España

Escrito 02 diciembre 2013 - 05:10

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