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;
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