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