Kendi Kendini Güncelleyen Yazılım Hazırlama...

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
kaan_karabey
Üye
Mesajlar: 107
Kayıt: 01 May 2013 05:30

Re: Kendi Kendini Güncelleyen Yazılım Hazırlama...

Mesaj gönderen kaan_karabey »

mrmarman yazdı:Bir kaç başlıkta cevap verdim ancak konunun başarılıyla kavranamadığınu gördüm. Bu nedenle aşağıdak kodu yayınlıyorum...

- Formunuza birer tane TIdFTP, TGauge, TStatusBar ve TButton koyun...

- Yapılan işlem kısaca şu : Yazılımınız ile tıpatıp aynı isimdeki bir dosyayı FTP sitesinden download edecek, ardından yazılımınızın kendi kendini kapatılması sağlanarak, siteden indirilen dosya ile yenilenecek ve yeni haliyle tekrar çalışacak şekilde tasarlandı.

- Bilerek bu örnek için 1 MB FTP'de yer ayırdım. Kısa süreliğine açık kalacak daha sonra kapatıcam. İlk denemeler için belki merak eden olur..

- Kaynak kodlarıyla birlikte örnek indirmek isteyenler için link vereyim..

http://rapidshare.com/files/58430354/SelfUpdate.zip

Kod: Tümünü seç

Var
  xDosyaUzunluk : LongInt;

function FTPDosyaAl( IdFTP : TIdFTP; SrcDosya, DesDosya:TFileName; Ftp, RemoteDir, Login, Pass : String ):Boolean;
begin // Uses IdFTP, IdFTPCommon
  Result := False;
  IdFtp.Host     := Ftp;
  IdFtp.Username := Login;
  IdFtp.Password := Pass;
  IdFtp.Passive  := True;
  IdFtp.Connect;
  If IdFtp.Connected then
  begin
    IdFtp.ChangeDir(RemoteDir);
    // Gauge'de kullanmak için
    // Dosya Uzunluğunu grlobal bir değişkene atıyoruz...
    xDosyaUzunluk := IdFtp.Size( SrcDosya );
    Try
      IdFtp.TransferType := ftBinary; // Uses IdFTPCommon
      IdFtp.Get(SrcDosya, DesDosya, True);
    Finally
      Result := True;
    end;
    IdFtp.Quit;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  If FileExists(ExtractFilePath(Application.Exename) +'Guncelle.BAT')
    then DeleteFile(ExtractFilePath(Application.Exename) +'Guncelle.BAT');
end;

procedure TForm1.Guncelle();
Var
  FTPAdres,
  KaynakDizin,
  Name,
  Pass,
  KaynakDosya,
  HedefDosya      : String;
begin
  // Bilerek bu örnek için 1 MB yer ayırarak açtığım FTP sunucu adresini veriyorum...
  FTPAdres    := 'emerkez.info';
  KaynakDizin := '/programlar';
  Name        := 'delphi';
  Pass        := 'arman';
  KaynakDosya := ExtractFileName(Application.Exename);
  HedefDosya  := ChangeFileExt( ExtractFilePath(Application.Exename) + KaynakDosya, '.BAK' );
  HedefDosya  := ChangeFileExt( ExtractFilePath(Application.Exename) + KaynakDosya, '.BAK' );

  If FileExists(HedefDosya) AND ( MessageDlg('Hedef Dosya Mevcut, üzerine yazılsın mı ? '+#13'('+HedefDosya+')', mtInformation, [mbYes, mbCancel], 0) = mrCancel )
   then EXIT
   else DeleteFile(HedefDosya);

  If FTPDosyaAl( IdFtp, KaynakDosya, HedefDosya, FTPAdres, KaynakDizin, Name, Pass )
    then MessageDlg('Dosya Başarıyla Alındı'+#13#13
                  + 'Şimdi program yeniden başlatılmak üzere kapatılacaktır....',
                  mtConfirmation, [mbOk], 0)
    else MessageDlg('Dosya Alınamadı'+#13'('+KaynakDosya+')', mtError, [mbok], 0);

  With TStringList.Create do begin
    Add('@Echo Off' );
    Add( Format('Copy %s %s', [ChangeFileExt(Application.ExeName,'.BAK'), Application.ExeName]) );
    Add('DEL '+ChangeFileExt(Application.ExeName,'.BAK'));
    Add( Application.ExeName );
    SaveToFile( ExtractFilePath(Application.Exename)+'Guncelle.BAT' );
    Free;
  end;
  Application.Terminate;
  WinExec( PChar( ExtractFilePath(Application.Exename)+'Guncelle.BAT'), SW_Hide );
end;

procedure TForm1.IdFtpStatus(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: string);
begin
  StatusBar1.SimpleText := AStatusText;
end;

procedure TForm1.IdFtpWork(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
begin
  Gauge1.Progress := AWorkCount;
  Application.ProcessMessages;
end;

procedure TForm1.IdFtpWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Integer);
begin
  Gauge1.MinValue := 0;
  Gauge1.MaxValue := xDosyaUzunluk;
  Gauge1.Progress := 0;
  Gauge1.Visible  := True;
end;

procedure TForm1.IdFtpWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  Gauge1.Progress := 0;
  Gauge1.Visible  := False;
end;
Kullanımı ise şu kadar basit...

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  Guncelle();
end;
:lol:

Linki Güncellermisiniz???
Sevgiler Yalan Olmuş Yalan Sahtekar Bırakıpta Bir Gün Seni Gitmeyecek Mi?
Cevapla