Giriş Yap Kayıt ol Online Üyeler Aktif Konular Arama Üyeler Forum Kuralları
Tahribat.Com | Programım Bir Kere Çalışsın.
Tahribat.Com Forumları
Delphi - Pascal
      Programım Bir Kere Çalışsın.
Bu Bölümde yeni konu açmak için tıklayın Konuyu cevaplamak için tık...
Konu 6 Haziran 2011 (Pazartesi) 23:19 tarihinde açıldı. Kısayol | Alıntı yap | Özel Mesaj
DuPi


Kayıt : 21 Agustos 2005
Erkek Üye
 

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


 


 
7 Haziran 2011 (Sali) 04:14 tarihinde yazıldı. Kısayol | Alıntı yap | Özel Mesaj
Tugberk


Kayıt : 4 Ekim 2009
Erkek Üye
 

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;
}

 
7 Haziran 2011 (Sali) 07:03 tarihinde yazıldı. Kısayol | Alıntı yap | Özel Mesaj
omerelili


Kayıt : 8 Temmuz 2007
Azerbaycan / Bakü
Erkek Üye
 
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)
   } 
}

VEREM olsaydında VEREN olmasaydın. 
7 Haziran 2011 (Sali) 11:42 tarihinde yazıldı. Kısayol | Alıntı yap | Özel Mesaj
DuPi


Kayıt : 21 Agustos 2005
Erkek Üye
 

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.


 
9 Temmuz 2011 (Cumartesi) 11:23 tarihinde yazıldı. Kısayol | Alıntı yap | Özel Mesaj
renegadealien


Kayıt : 23 Mart 2003
Ankara
Erkek Üye
 

Çok güzel hocam...


Eski bir magirus atasözü der ki; Basamakta durmayın, otomatik kapı çarpar... 
9 Temmuz 2011 (Cumartesi) 22:49 tarihinde yazıldı. Kısayol | Alıntı yap | Özel Mesaj
Fatih


Kayıt : 17 Temmuz 2005
Fatih
Erkek Üye
 

Visual Basic'te nasıl oluyor bu?


Obsesyonlar zihne giren, istenmeyen fakat zihne girmesine engel olunamayan sıkıntı yaratan düşüncelerdir. 
24 Kasim 2011 (Persembe) 00:04 tarihinde yazıldı. Kısayol | Alıntı yap | Özel Mesaj
DE5TROY3R


Kayıt : 4 Nisan 2007
Istanbulda / Rize
Erkek Üye
 

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

Visual Basic'te nasıl oluyor bu?


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

If App.PrevInstance = True Then
End
End If

tdsoftware.tr.cx 
24 Kasim 2011 (Persembe) 22:45 tarihinde yazıldı. Kısayol | Alıntı yap | Özel Mesaj
siyahbereli


Kayıt : 3 Ocak 2006
Erkek Üye
 

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.  
24 Kasim 2011 (Persembe) 23:21 tarihinde yazıldı. Kısayol | Alıntı yap | Özel Mesaj
DuPi


Kayıt : 21 Agustos 2005
Erkek Üye
 

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.


 

[1]


Bu Bölümde yeni konu açmak için dıklayın Konuyu cevaplamak için tık...
Allah'a Havale Et Google Bookmark'a Ekle Yahoo'ya Ekle Stumbleupon'a Ekle Facebook'a Ekle Twitter'a Ekle   Google'da Ara : Programım Bir Kere Çalışsın. Favorilerime Ekle Yukarı Çık
Konuda 9 Mesaj Var.
Konu 1289 Sefer Gösterilmiş.
2001-2012 © Tahribat Group - Her Hakkı Saklıdır. - ● Gizlilik İlkeleri ● Kullanım Koşulları ● İletişim