Programım Bir Kere Çalışsın.
-
Öncelikle şunu belirteyim. Yazımı Delphi programlama diline uygun bir şekilde anlatacam. Ama içerisinde temel mantık anlatılacağı için yararlı bir doküman olacağına inanıyorum.
Evet arkadaşlar bir çok uygulamamızda programımızın aynı anda sadece bir kez çalışmasını isteyebiliriz. Bu işlemi yapabilmek için Windows sistemlerde değişik yöntemler mevcut. Biz bu yazımızda GlobalAddAtom API’sini kullanacaz. GlobalAddAtom API’si windows’ta kernel32.dll dosyasında bulunur. Parametre olarak PansiString tipinde bir değişken alır. Bu değişken sistem belleğinde bir yerlerde kayıt olur. Normal yollarla bu alana erişim yapamadığımız için programa müdahele edemiyoruz. Ve bahsi geçen uygulama oturum açılmış sistemde sadece 1 defa çalışabiliyor. Peki bu sistem nasıl kullanabilir.
Uygulamanızın ilk açılışında. Yani OnCreate olayında öncelikle program daha önce açılmış mı onu kontrol etmemiz gerekiyor. Bu kontrol olayını GlobalFindAtom API’si ile kontrol ediyoruz. GlobalFindAtom API’si Tıpkı GlobalAddAtom API’si gibi çalışır. Ve bir parametre alır. Bu parametre ile gelen PansiString tipindeki değişkeni sistem belleğinde arar. Eğer bulursa 0 dan farklı bir değer alır. Buda bu programın açık olduğunu gösterir. Ve uygulama çıkış işlemlerini başlatır (Halt;) gibi.
Fakat sistem belleğine değişkeninizi aktardıktan sonra programı kapatsanız dahi bu kendi kendine silinmeyecektir. Bu yüzden onu formun onDestroy olayında hafızadan silmeliyiz. Bunuda GlobalDeleteAtom fonksiyonu ile yapıyoruz. Parametre olarak word tipinde bir değişken alıyor. O yüzden örnekteki kodları iyi inceleyin.
Bu konuyu pekiştirmeniz amacı ile bir unit oluşturdum. Anlamadığınız kısımları veya bu eksik diyenler lütfen konu altında cevap yazın.
Kullanım olarak;
uses kısmına bu kütüphaneyi ekleyin
Global değişkenler (var) altına
degiskenIsmi:Tdupi; yazın
OnCreate Olayına DegiskenIsmi.BirKereCalis('buEssizKodum');
OnDestroy Olayına DegiskenIsmi.YokEt;
yazın hayırlı olsun :)unit birkereCalis; interface uses windows,dialogs; type TDupi = object private i:integer; public procedure BirKereCalis(essizKelime:pansichar); procedure YokEt; end; implementation { TDupi } procedure TDupi.BirKereCalis(essizKelime: pAnsichar); begin if GlobalFindAtom(essizKelime) = 0 then i:=GlobalAddAtom(essizKelime) else begin MessageDlg('Bu Uygulama Zaten Çalışıyor',mtWarning,[mbYes],0); halt; end; end; procedure TDupi.YokEt; begin GlobalDeleteAtom(i); end; end. -
Bunun için kullanılan genel yöntem mutex nesnesi yaratmaktır, tek satırda hallolur.
if (CreateMutex(NULL, FALSE, "BirKere") && GetLastError() == ERROR_ALREADY_EXISTS) return;Mesela sadece 1 kere çalışan basit bir C programı.
#include <windows.h> #include <stdio.h> int main() { if (CreateMutex(NULL, FALSE, "BirKere") && GetLastError() == ERROR_ALREADY_EXISTS) return; printf("Program\n"); getchar(); return 0; } -
using System.Threading //Mutex nesnesini kullanabilmemiz için gerekli olan namespace static class Program { /// The main entry point for the application. [STAThread] static void Main() { bool IlkProgram; //bool tipinde bir değişken oluşturuyoruz çünkü mutex nesnemiz true yada false değerinde ürettiği veriyi bu değişkende saklayacak. Mutex Mtx = new Mutex(true, "Ilk Program", out IlkProgram); //Mutex nesnemizi oluşturuyoruz if (!IlkProgram) { //Buraya messageBox ile bir uyarı yazdırabilirsiniz.Örneğin "Bu uygulamanın bir kopyası zaten çalışıyor" denilebilir. Application.Exit(); //Uygulamayı kapat return; } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false);Application.Run(new MainForm()); GC.KeepAlive(Mtx); //Mutex Nesnesini bellekten kaldırıyoruz (kaptıyoruzda denilebilir) } } -
Mutlaka bilen vardır.
Mutex Olayına gelince; bir mutex oluşturdun. Program kapanınca Mutex kendi kendine yok oluyor mu?
birde bunların genel hacklenmesi olayı var tabi birazda bunlara değinelim.
benim programın hacklenmesi çok basit. OlyDbg ile string referanslarda bulursun EssizKelime yerine EssizKelime2 koyarsın. yeniden derlersin kırılır. Programı2 kere açabilirsin. Yada Mutexteki gibi 2 kere açık olduğu yeri söyleyen kısmı bulursun bir kaç satır altta FN miydi uzun zamandır bakmadım. çıkış ile ilgili kısmı değiştirirsin uyarıyıda atladın mı bitmiştir.
-
Çok güzel hocam...
-
Visual Basic'te nasıl oluyor bu?
-
Fatih bunu yazdı:
-----------------------------Visual Basic'te nasıl oluyor bu?
-----------------------------If App.PrevInstance = True Then End End If
-
Peki çalışan bir proğrama bir kere çalışssın nasıl yapabilriz..
-
Demek istediğin,
Eğer photoshop.exe bir kere çalışsın başka çalışmasın ise,
algoritması bu
a.exe pid(process id) alınır.
çalışan başka a.exe var mı kontrol edilir varsa hepsi yok edilir. 1 tane kalır o yok edilmediği sürece
açılacak her yeni a.exe kapatılır. bu yeni mi eski mi PID e bakılarak öğrenilir.
a.exe kapatıldığında PID değeri 0 lanır ilk açılan a.exe'nin PID değeri alınarak aynı işlemler yapılır.
şuan delphi kurulu değil yoksa bi sınıf hazırlayıp örnek ile gösterirdim. inşallah kurunca devam ederiz.
-
Bu olayı .net WPF'de nasıl uygularız bilen varsa analatabilirse sevinirim.
