Friday, March 7, 2014

Como actualizar nuestro programa en Delphi automáticamente

Ayer me llegó ésta pregunta y en el momento me pregunté si Embarcadero tenía un componente para hacerlo automágicamente, la respuesta es:   nosotros tenemos que programarla.

Pero lo bueno es que hay varias técnicas para hacerlo y existe una lógica para que deba ser programado por nosotros los desarrolladores, cuando el mismo código fuente funciona para plataformas autoactualizables como las móviles, hacer un componente de éste tipo es redundante.

Las técnicas dependen del estilo de programación que utilicemos, por ejemplo si tenemos un solo programa ejecutable ejemplo: un sólo archivo ".exe" debemos pensar en crear un pequeño programa de tipo "loader" que sea el que se ejecute previamente, revise la versión en nuestro sitio y sobrescriba el archivo principal.

Si utilizamos archivos .dll y nuestro programa está bien diseñado como para que las actualizaciones solo necesiten reescribir el dll, sólo necesitaríamos escribir la rutina en nuestra aplicación principal.

Aqui adjunto algunos ejemplos de rutinas que pueden ser utilizadas:

Este algoritmo reescribe nuestro programa a un .bak para poder descargar una nueva versión

EXE:=ParamStr(0);
BAK:=ChangeFileExt(EXE,'.BAK');
IF FileExists(BAK) THEN DeleteFile(BAK);
<If Update Available and ready for download>
  RenameFile(EXE,BAK);
  <Save downloaded file as EXE>
  <Execute EXE>
  ExitProcess(0) 
<End>

Aqui una muestra de código para ejecutar ésta idea

If strtoint(versionweb) > strtoint(versionlocal) Then
  begin
  Showmessage('Existe una nueva actualizacion
disponible...');
  Data := TMemoryStream.Create;
  IdHTTP2.Get('http://servidor.com/prog.exe',Data);
  Data.SaveToFile('prog.e_e');
  data.Free;

  content :=  'DIM WshShell, resultado'#10#13'Set
WshShell = WScript.CreateObject ("WScript.Shell")'#10#13+
              'resultado = Msgbox("Se va a realizar
una actualizacion al
tarificador...",64,"AutoUpdater")'#10#13+
              'WshShell.Run "%windir%\System32\cmd.exe
/C del /Q prog.exe ",0,true'#10#13+
              'WshShell.Run "%windir%\System32\cmd.exe
/C move prog.e_e prog.exe",0,true'#10#13+
              'resultado = Msgbox("Se realizo proceso
de actualizacion.",64,"AutoUpdater")'#10#13+
              'WshShell.Run "prog.exe"'#10#13+
              'WshShell.Run "%windir%\System32\cmd.exe
/C del /Q update.vbs",0,true'#10#13+
              'WScript.Quit()';

  Stream := TFileStream.Create('update.vbs', fmCreate);
  Stream.WriteBuffer(Pointer(content)^, Length(content));
  Stream.Free;

 
ShellExecute(Form1.Handle,nil,PChar('update.vbs'),'','',SW_SHOWNORMAL);
//  WinExec ('', 0);
  Application.ShowMainForm := False;
  Application.Terminate;
  end;

Raúl Morales Víquez raul.morales.víquez@hotmail.com / http://informatica-raulmorales.blogspot.com
Consultor en informática e Instructor, certificado en Seguridad Informática, Graduado en la Universidad Latina de Costa Rica con más de 10 años de experiencia en diversas áreas de cultura organizacional en empresas multinacionales.

No comments:

Post a Comment

Exploring the Differences between Red-Teaming and Blue-Teaming in Cybersecurity: Why Red-Teaming is Sexier; but Blue-Teaming is More Crucial

When it comes to cybersecurity, there are two teams that often get confused: redteams and blueteams. Redteams are the hackers, the ones w...