Programlamadili.Net Yeni Nesil Programlama Portali
Makale Ara: 
Kullanıcı Adı : Şifre :
  • Makale Kategorileri
Anasayfa
ACPI [0]
Action Script [5]
Ajax [7]
ASP [12]
ASP.NET [23]
Assembly [3]
Bash [1]
C [4]
C# [9]
C++ [10]
Cobol [1]
Delphi [31]
Flash [5]
Html [9]
JAVA [36]
Java Script [12]
JSF [2]
Jsp [6]
Lua [1]
Matlab [2]
MySQL [30]
Oracle [1]
Pascal [31]
Perl [4]
Photoshop [2]
PHP [154]
Python [8]
REXX [6]
Ruby [1]
SEO [5]
Visual Basic [37]
  • Gorsel Ders Kategorileri
Asp [25]
Asp.Net [5]
Csharp [33]
Delphi [3]
Fireworks [4]
Flash [10]
Java Script [0]
Photoshop [0]
PHP [55]
Vb.Net [9]
Visual Basic [4]
  • Dil
English
Deutsch
deutsch
  • Reklam Alani
C++ / Windows API ve C - (1)
Windows API ve C - (1)
Yazar: by_Coder
Eklenme: 25/01/08    Okunma: 543    
 
 

Windows işletim sisteminin programcıları en çok ilgilendiren kısımlarından biri olan Windows API (Application Programmer's Interface) ve Windows API'ın C (C++ da olabilir tabii) dili ile birlikte kullanımını inceleyeceğiz.


Öncelikle bazı noktalara değinelim;


C? C++? Class Library?

Büyük olasılıkla bildiğiniz gibi, C++ dilinin C'den en büyük farkı, OOP (object oriented programming - nesneye yönelik programlama) destekli olmasıdır. Nesnelerin programcının hayatını kolaylaştırdığı bariz bir gerçek. Windows API içinde belirli gruplara ayrılabilecek yüzlerce fonksiyon bulunuyor, bu yüzden API'ın sınıflar aracılığıyla kullanılması çok daha rahat. Benzer işlere yarayan fonksiyonları gruplar altında toplayan bu tür sınıflara wrapper class deniyor (mesela pencere için bir sınıf, buton için ayrı bir sınıf) ve etrafta WinAPI için kullanabileceğiniz pek çok türevi var, mesela Microsoft Foundation Classes (MFC) veya Borland Object Windows Library gibi. Ama bu sınıfları kullanabilmek için de az çok API bilgisi size gerekecek, ve bazılarımız (mesela ben) "dışarıdan alınmış" yardımcı sınıflar tarzı şeyler kullanmak istemeyebileceğinden, bu makalede sınıf kullanmadan, saf WinAPI ve C kodu kullanacağız.


Ama neden?

Pek çok neden sayılabilir. WinAPI seviyesinde çalışarak Windows'un iç yapısı hakkında epey bilgi edinmek mümkün. Her şey sizin kontrolünüz altında, üstelik herhangi bir ek bileşen kullanmadığınız için sonuç olarak derlenen programlar boyut olarak epey küçük olacaktır.


Ne gerekiyor?

Windows işletim sistemi şart. Bunun dışında bir C/C++ compiler ve orta düzeyde C bilgisi de gerekecek. Kullandığınız bir IDE varsa (mesela Microsoft Visual C++), Windows Application projesi oluşturarak makalede verilen kodları derleyebilirsiniz. Eğer "ben kendim derler, hatta sonra da bağlarım" derseniz, compiler ve linker ayarları size kalmış.


Bu noktalara da değindikten sonra, artık gönül rahatlığıyla makaleye geçebiliriz. Eğer sorularınız olursa, lütfen mutasyon.net C/C++ forumunu kullanın (veya maltanar@newyork.com adresinden beni direkt rahatsız edin :)).


windows.h Başlık Dosyası ve WinMain Fonksiyonu

Windows API, bilgisayar dünyası için bile soyut bir kavramdır ama oldukça somut olan bir bölümü vardır: DLL dosyaları. Windows klasörünün altında System veya System32 klasörü altında bulunan bu DLL dosyaları, Windows API'ın (ve de Windows'un) temelini oluşturur. DLL dosyaları, çalıştırılmaya hazır fonksiyonlar barındıran "kitaplıklar"dır. Windows API'e, API çağrıları veya fonksiyonları dediğimiz ve bu DLL'ler içinde bulunan fonksiyonlar aracılığıyla erişirsiniz. Bu DLL dosyalarının başlıcaları: kernel32.dll (çekirdek bileşeni, dosya işlemleri, bellek yönetimi...), user32.dll (kullanıcı iletişimi, mesaj kutuları, pencere yönetimi..), gdi32.dll (grafiklerle ilgili her şey, pencere çizimleri dahil) ve winmm.dll (multimeyda işlevleri) dosyalarıdır.


Bu DLL'ler içindeki fonksiyonlara erişmek için yapmanız gereken iki şey vardır; başlık dosyasını kodunuzdan çağırmak ve derlenmiş kodu uygun şekilde bağlamak (linking). Bağlama işini IDE'niz sizin için yapacaktır, sizin yapmanız gereken, başlık dosyasını çağırmak.


#include <windows.h>

Yukarıdaki satır, windows.h başlık dosyasını çağırarak programınıza engin WinAPI dünyasının kapılarını açar. Yazdığınız bütün Windows programlarında, bu çağrının bulunması şarttır.


Daha önce konsol programları yazdıysanız, program çalışınca ilk çalışacak olan fonksiyonun main fonksiyonu olduğunu bilirisiniz. Buna benzer şekilde, Windows programları da WinMain fonksiyonundan başlar.


WinMain fonksiyonu önceden tanımlanmıştır, bir prototipi vardır ve kodunuza bu şekilde yazmanız gerekir. Şimdi bu tanımı inceleyelim:


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument, int nCmdShow);


not: Instance Handle gibi terimleri Türkçeleştirmekten kaçınıyorum; "an tutamacı" pek hoş gelmiyor kulağa :)


Gördüğünüz gibi fonksiyonun döndürdüğü veri tipi int. Bu fonksiyondan değer döndürdüğünüz zaman programınız kapanmış olur. Döndürebileceğiniz farklı çıkış kodları (exit code) var; ama en sık kullanılanı 0 değeridir. Diğer parametrelere gelince...


HINSTANCE hInstance - Bazı WinAPI fonksiyonlarının gerektirdiği, programın şu an çalışan kopyasına bir referans. Bu referansı türüne Instance Handle deniyor.


HINSTANCE hPrevInstance - Win3.1 gibi 16-bit sistemlerde eğer program üst üste birkaç kez başlatılmışsa ve önce başlatılan kopya hala çalışıyorsa, programın önceki kopyasına bir referans. Win9x ve sonrasında her zaman NULL oluyor bu parametre.


LPSTR lpszArgument - Komut satırından programa geçilen argümanlar (main'deki argv gibi). LPSTR, Long Pointer to String manasına geliyor ve char * (harfe işaretçi) ile aynı işe yarıyor.


int nCmdShow - Eğer programın bir penceresi varsa (penceresiz Windows programı olur mu demeyin, az sonra yapacağız), pencerenin ilk başlatılıdığında hangi durumda olacağını gösteren parametre (ekranı kaplamış, simge durumuna küçültülmüş gibi).


Şu an elimizde basit (ama çok basit) bir Windows uygulaması yazmak için gerekli bilgiler var. O zaman, hemen ilk uygulamamızı yazalım.


#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpszArgument,int nCmdShow)
{
    const char *msj="Windows API ve C ile Merhaba Dünya!";
    const char *bas="Mesaj!";

    MessageBox(NULL,msj,bas,MB_OK);

    return 0;
}

Programı çalıştırdığınız zaman, dünyaya merhaba diyecek ve siz OK/Tamam butonuna tıkladıktan sonra da kaybolup gidecektir. Kod içinde tek yaptığımız, mesajın başlığını ve içeriğini barındıran iki adet char * tanımlamak ve mesaj kutusunu ekranda göstermek için MessageBox isimli fonksiyonu çağırmak. İsterseniz MessageBox fonksiyonunun tanımına da bir bakalım:


int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType);


Fonksiyonun döndürdüğü tip yine bir int, Evet/Hayır tarzı seçenekleri olan mesaj kutularında hangisinin seçildiğini anlamanıza yarıyor, bizim mesaj kutumuzda seçenek olmadığından dönen değerin önemi yok.


HWND hWnd - Eğer bu mesaj kutusu bir pencereye aitse, o pencerenin referansı. Bu pencere referanslarına window handle deniyorlar ve WinAPI'da hemen hemen her yerde görmek mümkün. Bu parametreye NULL geçerseniz, mesaj kutusu masaüstüne ait olur ve bir pencere belirtmenize gerek kalmaz.


LPCTSTR lpText - Mesajın içeriği. LPCTSTR, Long Pointer to Constant String (yani içeriği değişmeyecek bir karakter dizisine işaretçi) anlamına geliyor ve const char * ile aynı anlamda.


LPCTSTR lpCaption - Mesajın başlığı.


UINT uType - Mesaj kutusunun tarzı. Mesela Evet/Hayır butonları istiyorsanız, bu parametreyi MB_OK yerine MB_YESNO yapmalısınız. Bu parametreye gelebilecek diğer değerleri WinAPI yardım dosyalarında bulabilirsiniz. WinAPI yardım dosyalarını MSDN'den edinmek mümkün.




Taglar: C Programlama ile Dongulere Ornek Vermek Donusturme C Programlama Ile 3d Ekran Koruyusu C Programlama Ile Guzel bir Hesap Makinasi KodBank Cplus programlamada Dizi fonksiyonlari Sayinin negatif yada pozitif oldugunu bulma Windows API ve C - 1 Windows API ve C - 2 Windows API ve C - 4 Windows API ve C - 5 Windows API ve C- 3

Isminiz:
E-mail adresiniz:
Güvenlik Kodu:
  
 

 

Istatistikler ,
Sitemizde su anda 31 kategori, 458 makale , 148 görsel ders ve 1950 Ziyaretci bulunmaktadir...
Toplam üye sayimiz : 1118

Web Stats

Copyright © 2007 Programlamadili.net - Programlama & Tasarim: Recep Ikiz & Ferdi Küçük

| Site Haritasi |

"Ne Aradığını Bilmeyen Bulduğunun Farkına Varamaz "
ACPI Programlama dili, Action Script Programlama dili, Ajax Programlama dili, ASP Programlama dili, ASP.NET Programlama dili, Assembly Programlama dili, Bash Programlama dili, C Programlama dili, C# Programlama dili, C++ Programlama dili, Cobol Programlama dili, Delphi Programlama dili, Flash Programlama dili, Html Programlama dili, JAVA Programlama dili, Java Script Programlama dili, JSF Programlama dili, Jsp Programlama dili, Lua Programlama dili, Matlab Programlama dili, MySQL Programlama dili, Oracle Programlama dili, Pascal Programlama dili, Perl Programlama dili, Photoshop Programlama dili, PHP Programlama dili, Python Programlama dili, REXX Programlama dili, Ruby Programlama dili, SEO Programlama dili, Visual Basic Programlama dili,
Reklam alanı