23 Haziran 2014 Pazartesi

Delphide versiyon kontrolu yaparak açık olan programı güncelleme

Herkese selam, Bir çok arkadaşımız formlardan yararlanarak delphi ile download işlemini başarıyla gerçekleştiriyor fakat hep karşımıza dostlardan şöyle bir soru geliyor zamanında bende sormuştum bilirim o yüzden "Programım açıkken güncellemeyi nasıl yapacağım?","Açık exeyi güncellesek inen dosya ile yer değiştirir mi eski olan?" cevaba gelirsek yer değiştirmez fakat bazı Rename olayları ile bunu gerçekleştirebiliriz. Aşağıda bu olaylar için küçük ama kullanışlı bir örnek yapacağız. Öncelikle ve bana kalırsa programınızın güncel versiyonunu sorabileceği bir yer olması gerekir bunu kendi web sitenizin ftpsine versiyon.txt dosyası atarak yapabilirsiniz ben bu adım üzerinden gideceğim. Formumuza ekleyeceğimiz componentler: 1-)IdHTTP Bu örnek XE3 üzerinden yapılmıştır ve eksik kütüphane tanımlamanıze karşı kulandıklarımın hepsini yazıyorum.
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdHTTP,Vcl.ExtActns, Vcl.ComCtrls,
Vcl.StdCtrls;
Versiyon kontrolümüzle başlayalım başlayalım; VerisiyonKontrol adında proceduremizi gerekli kısma tanımladıktan sonra içerisine alta vericeğim kod parçasını yazınız. Açıklamaya gelirsek; SiteVersiyon değişkenimizin içine güncel versiyon bilgisini yazdığımız txt dosyasını çekiyoruz örneğin: 1.0.0.1 GetBuildInfo ile açık olan exemizin versiyon bilgilerini kontrolde kullanacağımız değişkenleri alıyoruz ve bunları ExeVersiyon değişkenimize sitedeki txt ile karşılastıracağımız şekilde formatlayarak aynı şekil şemale getiriyoruz. SiteVersiyon ve ExeVersiyon değişkenleri ile aldığımız versiyon bilgilerini karşılastırdığımız if sorgusundan dönen sonuca göre indirme işlemimizi gerçekleştireceğiz. Versiyonlar eşit ise güzel bir MessageBox ile şuan kullandığı versiyonu kullanıcıya gösterdik.
procedure TAnaSayfaForm.VersiyonKontrol;
var SiteVersiyon,ExeVersiyon: string; V1, V2, V3, V4: word;
begin
SiteVersiyon:=IdHTTP1.Get('http://www.siteadı.com/version.txt'); {YENİ SÜRÜMÜN VERSİYONUNUN YAZILI OLDUĞU TEXT DOSYASI}
GetBuildInfo(Application.ExeName, V1, V2, V3,V4);
ExeVersiyon:= Format('%d.%d.%d.%d', [V1, V2, V3,V4]);
if SiteVersiyon <> ExeVersiyon then
begin
if Application.MessageBox('Yeni versiyon çıkmış indirmek ister misiniz?','SORGU',MB_YESNO+MB_ICONQUESTION)=6 then
begin

Indir;

end;
end else
begin
ShowMessage('En güncel '+ ExeVersiyon +' versiyonunu kullanıyorsunuz.');
end;
end;

procedure TAnaSayfaForm.GetBuildInfo(const AppName: string; var V1, V2, V3,
V4: Word);
var
VerInfoSize, VerValueSize, Dummy: DWORD;
VerInfo: Pointer;
VerValue: PVSFixedFileInfo;
begin
VerInfoSize:= GetFileVersionInfoSize(PChar(AppName), Dummy);
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(PChar(AppName), 0, VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '', Pointer(VerValue), VerValueSize);
with VerValue^ do
begin
V1:= dwFileVersionMS shr 16;
V2:= dwFileVersionMS and $FFFF;
V3:= dwFileVersionLS shr 16;
V4:= dwFileVersionLS and $FFFF;
end;
FreeMem(VerInfo, VerInfoSize);
end;
Eğer versiyonlar eşit değil ise sıradaki işlemimiz olan indirme işlemine geçiyoruz. AdDeğiştir fonsiyonumuzdan bahsedeyim; Sebebi şuanki exemizin yeni gelen exe ile güncellenme sırasında uzantılarının aynı olmaması çünkü üzerine yazmayı deniyecektir indirme işleminde açık olan exenin üzerine yazamadığı için işlemi yapılmış olarak kabul edip devam edecektir. Bu yüzden Orjinal exemizin yolunu Fonksiyonumuza atıyoruz ve fonsiyon açık olan exemizin uzantısını .old yapıyor. Bu işlem gerçekleştikten sonra indirme işlemine kaldığımız yerden devam ediyoruz. Urlye yeni güncellenecek exemizin linkini yazacağız ve alta filename'ye dosya yolu + exenin adı, ki buradaki dosya yolunu açık olan projemizin dizinini alıyor. Try komutumuz işlevini yapınca görevini finally e devredince can alıcı yere geliyoruz. Burada programımızı hoş bir mesaj ile istersek Manuel kapatmalarını söyleyebiliriz fakat ben bunu tavsiye etmiyorum çünkü bazı şeyleri insanımızın gözüne ne kadar soksak da oradaki güncelleme = yeni şeyler olan yeri anlamayacaktır ve o an açık olan bir önceki versiyondan devam edecektir. Bu sebeple formumuzu close ediyoruz ki açılışta şöyle bir kontrol yapacağız o da .old uzantısına çevirdiğimiz programımızın eski versiyon exe'sini temizlemek amacı ile
procedure TAnaSayfaForm.AdDegistir(FileName: String);
var newName : string;
begin
newName := ChangeFileExt(FileName, '.old');
RenameFile(FileName, newName);
end;

procedure TAnaSayfaForm.Indir;
begin
AdDegistir('.Anime Listem.exe');
with TDownloadURL.Create(self) do
try
Screen.Cursor:=crHourGlass;
URL:='http://www.siteadı.com/Anime Listem.exe';
FileName :=ExtractFilePath(Application.ExeName)+'Anime Listem.exe';
ExecuteTarget(nil) ;
finally
Screen.Cursor:=crDefault;
Application.MessageBox('Güncelleme Tamamlandı.'+#13+'Lütfen programı tekrar başlatılıyor.','Bilgi',MB_OK or MB_ICONINFORMATION);
Free;
Self.Close;
end;
Formumuzun onCreate eventine geliyoruz burada 2 satırlık işimiz var ki bu 2 satırlarda; 1-) Biraz önce bahsettiğim .old uzantılı eski exemizi silecez 2-) VersiyonKontrol proceduremizi çağıracaz ki programımız açıldığında kontrole başlasın Delphinin DeleteFile komuzu ile dizinimizdeki eski exemizin yol ve adını yazıp kısa kodumuzu bitiriyoruz.

procedure TAnaSayfaForm.FormCreate(Sender: TObject);
begin
DeleteFile('.Anime Listem.old');
VersiyonKontrol;
end;

Eğer düzgün bir şekilde adımlarımızı uygulayarak giderseniz sorunsuz güncelleme işlemini yapabilirsiniz ek olarak internetten progressbar ilerleme özelliğinide araştırıp çok kolay bir şekilde entegre ederek daha hoş oto güncellemeler çıkartabilirsiniz. Yardımı dokunursa ne mutlu bize. Sürçü lisan ettiysek, haddimizi aştıysak hocalarımız ve arkadaşlarımızdan tekrar özür dilerim.