folder Tahribat.com Forumları
linefolder Delphi - Pascal
linefolder Programım Bir Kere Çalışsın.



Programım Bir Kere Çalışsın.

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DuPi
    DuPi's avatar
    Kayıt Tarihi: 21/Ağustos/2005
    Erkek

    Ö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.
    


     


    Ne zaman birşey öğrenmek istesem, Birden Vaktim Kalmıyor ?
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tugberk
    Tugberk's avatar
    Kayıt Tarihi: 04/Ekim/2009
    Erkek

    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;
    }
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Homer
    Homer's avatar
    Kayıt Tarihi: 08/Temmuz/2007
    Erkek
    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)
       } 
    }
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DuPi
    DuPi's avatar
    Kayıt Tarihi: 21/Ağustos/2005
    Erkek

    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.


    Ne zaman birşey öğrenmek istesem, Birden Vaktim Kalmıyor ?
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    renegadealien
    renegadealien's avatar
    Üstün Hizmet Madalyası Savaş Madalyası Başarı Madalyası Üstün Hizmet Madalyası Developer Madalyası
    Kayıt Tarihi: 23/Mart/2003
    Erkek

    Çok güzel hocam...


    10.05.2013 tarihli google arama sonucu : Aradığınız - "herşeyin hayırlısı rampanın bayırlısı" - ile ilgili hiçbir arama sonucu mevcut değil. Kendi özlü sözümdür, kaynak belirterek kullanınız.
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Fatih
    Fatih's avatar
    Kayıt Tarihi: 17/Temmuz/2005
    Erkek

    Visual Basic'te nasıl oluyor bu?


    enjoy i'm vaccinated
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DE5TROY3R
    DE5TROY3R's avatar
    Kayıt Tarihi: 04/Nisan/2007
    Erkek

    Fatih bunu yazdı:
    -----------------------------

    Visual Basic'te nasıl oluyor bu?


    -----------------------------

    If App.PrevInstance = True Then
    End
    End If
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    siyahbereli
    siyahbereli's avatar
    Kayıt Tarihi: 03/Ocak/2006
    Erkek

    Peki çalışan bir proğrama bir kere çalışssın nasıl yapabilriz..


    Yapmadıklarınıza pişman olmaktansa, Yaptıklarınıza pişman olun...Yapın pişman olun, yada yapmayın yine pişman olun.
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DuPi
    DuPi's avatar
    Kayıt Tarihi: 21/Ağustos/2005
    Erkek

    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.


    Ne zaman birşey öğrenmek istesem, Birden Vaktim Kalmıyor ?
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Muaddib
    Muaddib's avatar
    Kayıt Tarihi: 07/Haziran/2011
    Erkek

    Bu olayı .net WPF'de nasıl uygularız bilen varsa analatabilirse sevinirim.


    sic mundus creatus est
Toplam Hit: 5152 Toplam Mesaj: 10