InnoSetup: Problemas para comparar versiones (Solucionado)

Iniciado por DeXon18, 9 Marzo 2014, 19:47 PM

0 Miembros y 1 Visitante están viendo este tema.

DeXon18

Hola buenas tardes, llevo unos días comiéndome la cabeza...

Lo que quiero hacer es que cuando ejecuto el setup, comprueba las nuevas actualizaciones.
1) si no hay una nueva actualización, no mostrar ningún mensaje.
2) y si hay una nueva actualización, aparece un mensaje preguntando si desea descargarlo y que lleve a una web o no.

El codigo de pascal es este:
Código (pascal) [Seleccionar]

function DownloadFile(const AURL: string; var AResponse: string): Boolean;
var
  WinHttpRequest: Variant;
begin
  Result := True;
  try
    WinHttpRequest := CreateOleObject('WinHttp.WinHttpRequest.5.1');
    WinHttpRequest.Open('GET', AURL, False);
    WinHttpRequest.Send;
    AResponse := WinHttpRequest.ResponseText;
  except
    Result := False;
    AResponse := GetExceptionMessage;
  end;
end;

procedure InitializeWizard;
var
  DxLastVersion: string;

begin
  if DownloadFile('http://dex.wotanksmods.com/latestver.txt', DxLastVersion)  then
    MsgBox(DxLastVersion, mbInformation, MB_YESNO)
  else
    MsgBox(DxLastVersion, mbError, MB_OK)
end;


Sobre la versión he leído por hay que al ser x.x.x parece mas complejo el código ya me da lo mismo que sea así que sea xxx

Espero que alguien pueda ayudarme se lo agradecería en el alma de verdad.

Un saludo y mil gracias de antemano.

Eleкtro

#1
Sugerencia:

En una sección que está dedicada a todos los lenguajes en general, al menos podrías especificar que el lenguaje del que trata el post es Pascal, en un comentario o en un Tag, ya que no todos saben distinguir la sintaxis, y abrir un post sin saber de que lenguaje se habla es hacer perder el tiempo a todos los demás.

Sobre lo de 'el Setup', te digo lo mismo, ¿que Setup, que archivo de instalación, eso que es?, ¿acaso te refieres a un InstallBuilder ...InnoSetup por ejemplo?, ¡pues dilo!.

Saludos!








DeXon18

Cita de: Eleкtro en  9 Marzo 2014, 20:36 PM
Sugerencia:

En una sección que está dedicada a todos los lenguajes en general, al menos podrías especificar que el lenguaje del que trata el post es Pascal, en un comentario o en un Tag, ya que no todos saben distinguir la sintaxis, y abrir un post sin saber de que lenguaje se habla es hacer perder el tiempo a todos los demás.

Sobre lo de 'el Setup', te digo lo mismo, ¿que Setup, que archivo de instalación, eso que es?, ¿acaso te refieres a un InstallBuilder ...InnoSetup por ejemplo?, ¡pues dilo!.

Saludos!

Tienes dota la razón ya esta comentado para que no haya lios, Sorry   :-(

Eleкtro

#3
Aquí tienes un método de uso genérico para comparar una versión:

Cita de: http://www.vincenzo.net/isxkb/index.php?title=DirectX_-_How_to_detect_DirectX_version
Código (pascal) [Seleccionar]
// This function compares version string
// return -1 if ver1 < ver2
// return  0 if ver1 = ver2
// return  1 if ver1 > ver2
function CompareVersion( ver1, ver2: String ) : Integer;
var
 verint1, verint2: array of Integer;
 i: integer;
begin

 SetArrayLength( verint1, 4 );
 DecodeVersion( ver1, verint1 );

 SetArrayLength( verint2, 4 );
 DecodeVersion( ver2, verint2 );

 Result := 0; i := 0;
 while ( (Result = 0) and ( i < 4 ) ) do
 begin
  if verint1[i] > verint2[i] then
   Result := 1
  else
     if verint1[i] < verint2[i] then
     Result := -1
   else
     Result := 0;

  i := i + 1;
 end;

end;

A eso deberías pasarle el String de la versión que te descargas, y la propiedad 'AppVersion' Del ISS.

Saludos








DeXon18

Cita de: Eleкtro en  9 Marzo 2014, 21:02 PM
Aquí tienes un método de uso genérico para comparar una versión:


Gracias Elektro por la respuesta, mi pega esta cuando intento juntar esos 2 scripts que no se como hacerlo

Eleкtro

#5
Cita de: DeXon18 en  9 Marzo 2014, 21:04 PM
mi pega esta cuando intento juntar esos 2 scripts que no se como hacerlo

No manejo Pascal, espera la respuesta de alguien que sepa más que yo, pero de todas formas sería algo así:

Código (pascal) [Seleccionar]
const
  // La constante de la versión actual.
 AppVer = 1.0;

begin
// Si el archivo se descarga corréctamente...
if DownloadFile('http://dex.wotanksmods.com/latestver.txt', DxLastVersion)  then

   // comparo el string de la version descargada, con la version actual...  // return 1 if ver1 > ver2
   if CompareVersion(DxLastVersion, AppVer) = 1 then
     // Se ha encontrado una versión más actualizada, hacer lo que quieras...
     // Code goes here.

   else
     // Estás usando la versión más reciente.
     // Do nothing.

   end;

end;








DeXon18

#6
Cita de: Eleкtro en  9 Marzo 2014, 21:12 PM
No manejo Pascal, espera la respuesta de alguien que sepa más que yo, pero de todas formas sería algo así:

Código (pascal) [Seleccionar]
const
  // La constante de la versión actual.
 AppVer = 1.0;

begin
// Si el archivo se descarga corréctamente...
if DownloadFile('http://dex.wotanksmods.com/latestver.txt', DxLastVersion)  then

   // comparo el string de la version descargada, con la version actual...  // return 1 if ver1 > ver2
   if CompareVersion(DxLastVersion, AppVer) = 1 then
     // Se ha encontrado una versión más actualizada, hacer lo que quieras...
     // Code goes here.

   else
     // Estás usando la versión más reciente.
     // Do nothing.

   end;

end;


Gracias por la inspiración Elektro, te debo una buena cerveza !!

El codigo seria este:
Código (pascal) [Seleccionar]
function DownloadFile(const AURL: string; var AResponse: string): Boolean;
var
  WinHttpRequest: Variant;
begin
  Result := True;
  try
    WinHttpRequest := CreateOleObject('WinHttp.WinHttpRequest.5.1');
    WinHttpRequest.Open('GET', AURL, False);
    WinHttpRequest.Send;
    AResponse := WinHttpRequest.ResponseText;
  except
    Result := False;
    AResponse := GetExceptionMessage;
  end;
end;

procedure DecodeVersion( verstr: String; var verint: array of Integer );
var
  i,p: Integer; s: string;
begin
  // initialize array
  verint := [0,0,0,0];
  i := 0;
  while ( (Length(verstr) > 0) and (i < 4) ) do
  begin
  p := pos('.', verstr);
  if p > 0 then
  begin
      if p = 1 then s:= '0' else s:= Copy( verstr, 1, p - 1 );
    verint[i] := StrToInt(s);
    i := i + 1;
    verstr := Copy( verstr, p+1, Length(verstr));
  end
  else
  begin
    verint[i] := StrToInt( verstr );
    verstr := '';
  end;
  end;

end;

function CompareVersion( ver1, ver2: String ) : Integer;
var
  verint1, verint2: array of Integer;
  i: integer;
begin

  SetArrayLength( verint1, 4 );
  DecodeVersion( ver1, verint1 );

  SetArrayLength( verint2, 4 );
  DecodeVersion( ver2, verint2 );

  Result := 0; i := 0;
  while ( (Result = 0) and ( i < 4 ) ) do
  begin
  if verint1[i] > verint2[i] then
    Result := 1
  else
      if verint1[i] < verint2[i] then
      Result := -1
    else
      Result := 0;

  i := i + 1;
  end;

end;


function GetDeXVersion(): String;
var
  DeXVersion:  String;
begin
  DeXVersion := '';
  DownloadFile('http://www.laurl.com/latestver.txt', DeXVersion );
  Result := DeXVersion;
end;


function InitializeSetup(): Boolean;
begin
  if CompareVersion(GetDeXVersion(), '3.3.6') > 0 then
  begin
    Result := MsgBox('Se ha encontrado una version mas?',mbConfirmation, MB_YESNO) = idYes;
    if Result = False then
      MsgBox('Aqui mensaje para ir a la url o donde sea', mbInformation, MB_OK);
  end
  else
    Result := true;
end;


Un saludo y gracias de nuevo