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!
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

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

Mesaj gönderen mrmarman »

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:
Resim
Resim ....Resim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Eline emeğine sağlık Muharrem hocam gene döktürmüşsün :)
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

Sağolun, ellerinize ve beyninize sağlık.
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

Mesaj gönderen vampir261 »

Güzel bir makale bir ara çok tırmalamıştım ama yapmaya muvaffak olamamıştım :( Gerekirse yapılmışı var :D deyip burdan alırız artık. Eliniz dert görmesin.
Anlatırsanız unuturum,
Gösterirseniz hatırlarım,
Yaptırırsanız anlarım.
Kullanıcı avatarı
KoPilot
Üye
Mesajlar: 185
Kayıt: 05 Eki 2007 08:02

Mesaj gönderen KoPilot »

Ellerinize sağlık hocam...
Eyvallah..
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

Valla ne yalan söyleyeyim ayaklı delphi programlama kursu gibisin üstad.

çok teşekkürler. Ben kendi çapımda paröçaladım bişiler. ama benim kod ftp değilde normal HTTP üzerinde çalışıyor. yalnız çalışan exe ile ilgikli sorunları aşmak için 2. bir exe yapmak zorunda kaldım.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
Trial_Cooder
Üye
Mesajlar: 236
Kayıt: 17 Nis 2006 04:44

Mesaj gönderen Trial_Cooder »

bende şöyle bişey yaptım kısa ver öz iş görür...

Kod: Tümünü seç

uses : ShellApi, UrlMon

function DownLoadInternetFile(Source, Dest : String): Boolean;
begin
  try
    Result := URLDownloadToFile(nil,PChar(Source),PChar(Dest),0,nil) = 0
  except
    Result := False;
  end;
end;


procedure TForm1.Update(Sender: TObject);
var
 SourceString, DestinationString: string;
F: TextFile;
szFileName: array[0..MAX_PATH] of Char;
DirAct:string;
begin
SourceString := 'http://www.site.com/program.exe'';
DestinationString := Application.ExeName + 'program.exe';

if DownLoadInternetFile(SourceString, DestinationString) then
begin
 GetModuleFileName(hInstance, szFileName, MAX_PATH);
 DirAct:=szFileName;
 AssignFile(F,'erase.bat');
 Rewrite(F);
 Writeln(F, 'cd '+ExtractFilePath(DirAct));
 Writeln(F, 'del eskiprogram.exe');
 Writeln(F, 'yeniprogram.exe');
 Writeln(F, 'del erase.bat');
 CloseFile(F);
 ShellExecute(0,nil,PChar(ExtractFilePath(DirAct)+'erase.bat'),nil,nil,SW_HIDE);
end
else
  MessageDlg('Update Gerçekleştirilemedi!', mtError, [mbOK], 0);
end;
Kullanıcı avatarı
kelaynak2
Üye
Mesajlar: 135
Kayıt: 30 Haz 2003 02:18

Güzel ama..

Mesaj gönderen kelaynak2 »

Muharrem Usta eline sağlık ama bir sorun var ki hex editörle kodları inceleyen birisi ftp nin şifresini öğrenebilir ve dosyalara zarar verebilir.
Olmaz olmaz demeyin.
:wink:
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Kendime ait FTP'den verdim ve yazılım için özel bir hesap açtım. Bu şifreyi bilseler de ne gibi bir güvenlik açığı olabilir örnekleyebilir misin ?

- Kısaca bu tip işlemler için ayrılmış bir alandaki şifreyi birilerinin öğrenmesi hiçbirşey ifade etmez. 1 MB'lık kısıtlı bir alan. Bir de sadece download aktif upload kapalı yaparsınız olur biter. Kısaca update işlemlerinde kullanılmak için böyle özel bir hesap açılabilir onu örneklemek istedim.

- FTP hesaplandırmadan anlamayanlar anonymouse FTP sunucuları kullanabilirler veya alternatif yollar kullanabilirler.

- Alternatif derken FTP olmak zorunda değil ki, orası bir blok modül. HTTP ile indirirsiniz, ağ altından map edilmiş bir yerden indirirsiniz, kullanıcının taşınabilir belleğinden veya CD'den kurdurursunuz kaynak tümüyle göreceli bir konu.
Resim
Resim ....Resim
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

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

Mesaj gönderen haydarxxx »

Hocam makalenizi yayınlayalı çok oldu ve bu makaleyi ilk yayınladığınızda kullanmıştım tıkır tıkır çalışıyor.
Ama şimdi çalıştıramıyorum.Delphi7 ve standart indy kullanıyorum.Fakat şu hatayı alıyorum.

Kod: Tümünü seç

[Fatal Error] Unit1.pas(8): File not found: 'IdExplicitTLSClientServerBase.dcu'
uses den tanımlı olan 'IdExplicitTLSClientServerBase.dcu' siliyorum.
Kendi ftp şifrelerimi yazıp çalıştırıyorum.exe dosyasını indiryor fakat açmıyor.Sorun nedir anlamadım :oops:
Kullanıcı avatarı
turkerunutmaz
Üye
Mesajlar: 57
Kayıt: 04 Oca 2008 04:53
Konum: İstanbul
İletişim:

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

Mesaj gönderen turkerunutmaz »

bende hata verdiyor bat yığınında program kullanılıyor diyor kopyalamıyor. nasıl yaparız?
CeRBeR
Üye
Mesajlar: 2
Kayıt: 11 Tem 2010 01:33

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

Mesaj gönderen CeRBeR »

Hocam merhabalar eski bir konuyu yeniden hortlattığımı biliyorum ama yardımınıza ihtiyacım var

Yukardaki kodu kullandığımda herşey normal seyrinde ilerliyor öncelikle bak dosyası ftp den download ediliyor (hatta bu bak dosyasını yakalayıp uzantısını exe yaptığımda yeni sürüm olduğunu görebiliyorum) sonra program kapanıp açılıyor ama yeni sürüm geleceğine eski sürüm geliyor acaba o güncelle.bat dosyasına yazdığımız komutlar winxp de veya win7 de çalışmıyorlarmı ?
CeRBeR
Üye
Mesajlar: 2
Kayıt: 11 Tem 2010 01:33

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

Mesaj gönderen CeRBeR »

Up!

Hocalarım en azından azıcık beyin fırtınası felan yapsak şu anda tıkanmış durumdayım belki göremediğim yeri birlikte görebiliriz :(
smokie
Üye
Mesajlar: 72
Kayıt: 01 Tem 2007 10:26

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

Mesaj gönderen smokie »

CeRBeR yazdı:Hocam merhabalar eski bir konuyu yeniden hortlattığımı biliyorum ama yardımınıza ihtiyacım var

Yukardaki kodu kullandığımda herşey normal seyrinde ilerliyor öncelikle bak dosyası ftp den download ediliyor (hatta bu bak dosyasını yakalayıp uzantısını exe yaptığımda yeni sürüm olduğunu görebiliyorum) sonra program kapanıp açılıyor ama yeni sürüm geleceğine eski sürüm geliyor acaba o güncelle.bat dosyasına yazdığımız komutlar winxp de veya win7 de çalışmıyorlarmı ?
Merhabalar,

aynı sorunu bende yaşıyorum. sorunu çözdünüzmü?

Program birden fazla çalışır durumda ise değiştirme işlemini yapmıyor. exe bir kerede calışsa indirmesine rağmen güncelleme tammlanmıyor.
sanırım sorun exe tam anlamı ile kapatılmadan kopyalama işlemine geçmesinden.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

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

Mesaj gönderen mrmarman »

- Birden fazla kere çalışıyorsa da aslında sorun yaşamamanız lazım. Çünkü EXE'nin adını değiştirmeyi başarmak ile ilgili bir olay bu.

- Eğer çalışan EXE ağ altında paylaşılmış ise o zaman bazen sıkıntı olabilir. Bu durumda şunu yapın, projeniz AĞ altında ise
(1) TCP üzerinden tüm çalışanların bir sunucu kontrol projesi ile irtibatını sağlayın. Bu sunucu onlara kendinizi kapatın komutu yollasın.
(2) Veya UDF üzerinden broadcast ile ağ altındaki tüm PC'lere yayın yapın. Bu yayını alan ilgili EXE kendini kapatsın, yeniden açsın.

- Tabi bunlar ekstra çabalar. Farklı başlıklarda bunları örnekledik. Forumda arayarak bulabilirsiniz. Biz burada nominal çalışmayı örnekledik. :idea:
Resim
Resim ....Resim
Cevapla