ArÅŸiv Anasayfa API(Application Programming Interface)
Sayfalar: 1
Windowsu Kapatmak Gönderen: FetihlerFatihi Tarih: 10 May 2006 12:04:25
: Memik Yanık
Bu yazı yazarın Delphi’nin .NET uyumlu versiyonunu konu ettiği kitabının Api fonksiyonları adlı bölümün bir kısmıdır. http://www.seckin.com.tr/urun.aspx?productID=6451

Windows’u Kapatmak – ExitWindowsEx() Fonksiyonu

Windows yeniden başlatılmak istendiğinde Windows’un ExitWindowsEx() fonksiyonu kullanılmaktadır. Ancak bu fonksiyon kullanılan Windows sürümünden ve Windows’un mevcut ayarlarından etkilenmektedir. Bu nedenle istenilen sonuçlar alınamayabilir.

Bildiğiniz gibi .NET Framework ile gelen MessageBox sınıfı System.Windows.Forms adlı Namespace’te tanımlıdır ve bu Namespace projelere otomatik olarak dahil edilmektedir. Ancak API fonksiyonlarını kullanmak üzere koda Borland.Vcl.Windows adlı Namespace’i projeye dahil ettiğinizde derleyici MessageBox sınıfını hangi Namespace’te arayacağına karar veremiyor. Bu nedenle kod dosyasına Borland.Vcl.Windows’u dahil ettiğinizde MessageBox sınıfının başına tanımlı olduğu Namespace’i yazmalısınız.



ExitWindowsEx() fonksiyonu 2 parametreye sahiptir. Bu fonksiyona ilk parametre olarak 0 veya EWX_LOGOFF değeri verildiği zaman o sırada programların çalışması sona erdirilir ve geçerli kullanıcının açmış olduğu oturum kapatılır. Aşağıda verilen ekran görüntüsünü ExitWindowsEx() fonksiyonunu anlatmak için hazırladığım projeyi çalıştırıp “Oturumu Kapat” başlıklı düğmeyi tıkladıktan sonra aldım.



Bu sırada Evet başlıklı düğme tıklanırsa MessageBox() fonksiyonu geriye “Yes” değerini gönderir ve ExitWindowsEx() fonksiyonu işletilerek mevcut oturum kapatılır.


İlk parametre olarak “1” veya EWX_SHUTDOWN verilirse bilgisayar kapatılır. Bu fonksi¬yona ilk parametre olarak EWX_REBOOT değeri verilirse bilgisayar kapatılıp yeniden açılır. Bu fonksiyon Windows sürümünden ve Windows’un mevcut ayarlarından etkilendiği için istediğiniz sonucu alama¬yabilirsiniz.

Kullanmak istediğiniz API fonksiyonu ile ilgili ve Borland tarafından geliştirilen Namespace’i koda dahil etmediyseniz fonksiyonu deklare edip tanımlı olduğu DLL dosyasını işaret etmeli¬siniz. Şimdi Borland.Vcl.Windows aldı Namespace’ten yararlanmadan bu fonksiyonu Visual Basic ve C’deki gibi deklare edip kullanacağım. Bu amaçla ilk olarak kod dosyasının Implementation bloğunda ExitWindowsEx() fonksiyonunu aşağıdaki gibi deklare ettim.



ExitWindowsEx() fonksiyonu bu şekilde deklare edildikten sonra Delphi projesi dahilinde kullanılabilir. Fonksiyonun deklare edildiği satırda görebileceğiniz gibi geriye Boolean bilgi gönderilmektedir. Burada Flags parametresinin yerine 0 yazdığım için oturum kapatılır.

:
Sonuc := ExitWindowsEx(0, 0);

Yukarıda hakkında bilgi verilen ExitWindowsEx() fonksiyonu Windows’un “users32.dll” adlı DLL dosyasında tanımlıdır. Bu fonksiyonu Visual Basic projesi dahilinde kullanmak istemiş olsaydım aşağıdaki gibi deklare ederdim.



Yukarıda hakkında bilgi verdiğim ExitWindowsEx() fonksiyonundan C# veya C++ projesi dahilinde yararlanmak istemiş olsaydım bu fonksiyonu aşağıdaki gibi deklare ederdim.

:
[DllImport("User32")]
       public static extern bool ExitWindowsEx(
               int uFlags, int dwReserved);

Delphi projeleri dahilinde API fonksiyonlarını C#’taki gibi kullanmak istiyorsanız DllImport deyimi ile fonksiyonun tanımlı olduğu DLL dosyasını işaret ettikten sonra C#’taki gibi deklare edip .NET Framework ile gelen System.Runtime.InteropServices adlı namespace’i koda dahil etmelisiniz. Bu namespace’i koda dahil ettikten sonra ExitWindowsEx() fonksiyonunu aşağıdaki gibi deklare edip kullandım.




Şimdiye kadar API fonksiyonları hakkında verilen bilgilere göre Delphi’nin daha önceki sürümlerini kullandıysanız API fonksiyonlarını kullanırken Borland tarafından geliştirilen Borland.Vcl.Windows ve Borland.Vcl.ShellApi gibi Namepsace’leri koda dahil edip fonksi¬yonu kullanmak kolayınıza gelecektir. Bu kitapta örnek olması için hakkında bilgi  verilen API fonksiyonlarını kullanırken yukarıda söz edilen her 3 teknik te kullanıldı.