klavye öğrenmek

Scroll Bar Kontrolünin Kullanımı

klavye

            Yapılacak ilk iş SetScrollRange fonksiyonuyla scroll bar için mantıksal bir skala belirlemektir. Bu işlem örneğin WM_CREATE mesajı içerisinde yapılabilir. Prototip:


            Fonksiyonun birinci paremetresi hangi pencereye ilişkin scroll bar işlemi uygulanacağıdır. Eğer gömülü scroll bar söz konusuysa ana pencerenin handle'ı geçirilmelidir. İkinci parametre üç değer alabilir: Eğer kontrole ilişkin ayarlama yapılıyorsa SB_CTL, pencereye gömülü scroll bar ayarlamaları için SB_VERT ya da SB_HORZ kullanılmalıdır. Üçünü ve dördüncü parametreleri skala aralığını belirtir. Beşinci parametre kontrol üzerindeki görüntünün güncellenmesiyle ilgilidir. Skala belirlendikten sonra WM_HSCROLL ya da WM_VSCROLL mesajları işlenir. Mesaj içerisinde mesajın geliş sebebi bir switch ile soruşturulmalıdır.


            Bu switch içerisinde şu belirlemeler yapılmalıdır:

- Scroll bar ok'larına click yapıldığında ne kadar bir öteleme yapılacak,
- Ara bölgelere click yapıldığında ne kadar öteleme yapılacak,

            Bu belirlemelerden sonra switch deyiminin dışında SetScrollPos API fonksiyonuyla düğme yeni yerine yerleştirilmelidir. Prototipi:

Klavye Mesajları


            Klavyede bir tuşa basıldığında WM_KEYDOWN çekildiğinde de WM_KEYUP mesajları Windows tarafından gönderilir. Klavye mesajları girdi odağına(input focus) sahip olan pencereye gönderilmektedir. Bir t anında üzerinde mavi bant olan pencereye aktif pencere denir. Yalnızca hWndParent olarak NULL girilmiş olan pencereler aktif olabilir. Yani yalnızca top level pencereler aktif olabilir. Mouse ile bir üst pencerenin içindeki alt pencereye click yapıldığında alt pencerenin en üst penceresi otomatik olarak aktif pencere yapılır. Girdi odağı(input focus) klavye mesajlarının gönderileceği penceredir. Girdi odağı bir alt pencereye verilebilir. Özetle bir üst pencerenin içerisinde bir alt pencere varsa ve alt pencerenin üzerine click yapılmışsa girdi odağını alan pencere alt pencere olur ama o pencerenin en üst penceresi aktif pencere yapılır. Girdi odağını herhangi bir pencereye verebilmek için SetFocus API fonksiyonu kullanılır. Prototipi:


Fonksiyonun parametresi girdi odağının verileceği pencerenin handle'ıdır. Fonksiyonun geri dönüş değeri girdi odağına sahip olan eski pencerenin handle'ıdır.
            Girdi odağı bir alt pencereye verilirse o pencerenin en üs penceresi otomatik olarak aktif pencere olur. Girdi odağının hangi pencerede olduğu GetFocus API fonksiyonuyla alınabilir. Prototipi:



Fonksiyon girdi odağına sahip olan pencerenin handle'ıyla geri döner.

Sanal Karakter Kodları(Virtual Key Codes)

            Klavyedeki özel tuşların ASCII kodları 0'dır. Bu tuşlar birbirlerinden scan code'larıyla ayrılabilir. Scan code'ları ise genel olarak donanıma bağlı bir biçimde belirlenmektedir. Windows sistemlerinde değişik donanıma sahip klavyeler bağlanabilir. Bu klavyeler üzerindeki özel tuşların scan code'ları birbirlerinden farklı olabilir. Örneğin 101/102 tuşlu IBM klavyelerinde F1 tuşunun extended scan code'u 0x3B'dir. Windows sisteminin pek çok değişik donanımlarda çalışabileceği varsayılmıştır. Eğer özel tuşların scan code'ları doğrudan program içerisinde kullanılsa önemli bir taşınabilirlik problemi çıkar. Örneğin:


Burada ch ile F1 tuşu karşılaştırılmaya çalışılmıştır. Çünkü F1 tuşunun extended scan code'u 0x3B'dir. Ancak bu program farklı bir donanımda çalıştırılmak istendiğinde o donanımdaki F1 tuşunun scan code'u 0x3B olmayabilir. Bunun çözümü için sanal karakter kodları tasarlanmıştır. Basılan tuşun bilgisi klavye sürücüsü tarafından standart sanal karakter kodlarına dönüştürülmektedir. Program içerisinde programcı donanım ne olursa olsun hep sanal karakter kodlarını kullanır. Çünkü scan code'dan sanal karakter koduna dönüşüm yapılması aşağı seviyede çalışan klavye sürücüsü tarafından yapılmaktadır. Windows.h içerisinde VK_XXX biçiminde bütün tuşların sanal karakter kodları sembolik sabitler biçiminde tanımlanmıştır. Sonuç olarak özel tuşlar kullanılacaksa onların sanal karakter kodları kullanılmalıdır. Alfabetik ve sayısal karakterlerin sanal karakter kodları ASCII kodlarıyla aynıdır. Bunlar için özel bir VK_ tanımlamasına gerek duyulmamıştır.

Klavye Mesajları


            Klavyede bir tyuşa basıldığında WM_KEYDOWN, çekildiğinde ise WM_KEYUP mesajları gönderilir. Sisteme ilişkin özel tuşlar için ayrıca WM_SYSKEYDOWN ve WM_SYSKEYUP mesajları gönderilir. Bu mesajalrın parametreleri şöyledir: wParam parametresine basılan tuşun sanal karakter kodu yerleştirilir. lParam parametresi aşağıdaki gibi düzenlenmiştir:


Yineleme sayısı normal olarak 1 olur. Sistem çok yavaşladığında bir tuşa sürekli basılma durumunda iki tuşa basılma arasında anı tuşun bilgisini farklı bir mesaj biçimin değil, aynı mesajın yinelenme sayısı biçiminde kodlayabiliyoruz. OEM scan code klavyenin orijinal scan code'udur.

WM_CHAR Mesajı


            WM_CHAR mesajı Windows tarafından kuyruğa gönderilmez. TranslateMessage API fonksiyonu tarafından çağırılır. Prototip:


            Bu fonksiyon isteğe bağlı olarak mesaj döngüsünün içerisine yerleştirilir. Yani bu fonksiyon mesaj dögüsünden kaldırılsa WM_CHAR mesajı oluşmaz. Bu fonksiyon kuyruktan alınan mesajı inceler, bu mesaj WM_KEYDOWN ise basılmış olan tuşun bir ASCII tuşu olup olmadığına bakar. Eğer basılan tuş bir ASCII tuşu ise bu tuş için WM_CHAR mesajını kuyruğa yerleştirir. Bu mesajın wParam parametresi basılan tuşun UNICODE karakter karşılığıdır(ASCII tablosu UNICODE tablosunun ilk 256 karakteridir). lParam WM_KEYDOWN mesajında olduğu gibi ilave bilgileri içerir.
            Program içerisinde görüntülenmek istenen bir yazı söz konusuysa WM_KEYDOWN mesajı yerine WM_CHAR mesajının işlenmesi daha uygundur.


Listbox kontrolünde enter tuşuna basıldığında sanki doubleclick yapılmış gibi seçme işleminin sağlanması yukarıdaki gibi bir işlemle sağlanabilir.

Modeless Dialog Pencereleri


            Modal bir dialog penceresi DialogBox API fonksiyonuyla açılır, EndDialog API fonksiyonuyla kapatılır. Modal bir dialog penceresine girildiğinde dialog penceresinin gerçek pencere fonksiyonu mesaj kuyruğunu kontrol altına alarak yalnızca dialog işlemlerinin yapılmasını sağlar. Oysa modeless dialog pencereleri mesaj döngüsünü kontrol altına almaz. Ayrı bir üst pencere gibi çalışmaktadır. Modeless dialog pencerelerinin mesajları ana mesaj döngüsü yoluyla işlenir. Modeless bir dialog penceresi CreateDialog API fonksiyonuyla yaratılır. Bu fonksiyon kaynaktan(resource) hareketle bütün kontrolleri yaratır ve çalışmasını bitirir. Tabii pencere görünür durumda kalır. Modeless dialog pencerelerinin mesajları normal bir pencere gibi ana mesaj döngüsünden hareketle ele alınmaktadır. Kullanıcı açısından bakıldığında modal ve modeless dialog pencereleri arasında önemli farklar vardır. Modal dialog penceresi açıldığında dialog penceresi dışında diğer pencereler için hiçbir işlem yapılamaz(Kapatılana kadar). Oysa modeless dialog pencereleri açıldığında başka pencerelerle ilgili işlemler gerçekleştirilebilir. Modeless dialog pencereleri çok nadir kullanılır(Tipik uygulaması Find & Replace). Modeless dialog pencereleri "Owned Window" olarak yaratılır. Yani asıl pencerenin dışına sürüklenebilir. Ana pencere minimize edildiğinde o da minimize edilir. Modeless dialog pencereleri normal bir pencere gibi DestroyWindow API fonksiyonuyla kapatılır.CreateDialog API fonksiyonunun prototipi:


            Tıpkı modal dialog pencerelrinde olduğu gibi modeless dialog pencerelerin de bir pencere fonksiyonları vardır. Kontroller yine gerçek pencere fonksiyonunun WM_CREATE mesajında oluşturulur. Programcının son parametre olarak belirttiği pencere fonksiyonu gerçek pencere fonksiyonu değildir, onun tarafından çağırılacak yapay pencere fonksiyonudur.

Modeless Dialog Penceresine İlişkin Uygulama

            Fırtça yaratmak için kullanılan CreateBrushIndirect fırçanın pek çok özelliğini belirlememize olanak sağlanmaktadır. Bu fonksiyonun alternatifi olarak CreateSolidBrush fonksiyonu kullanılabilir. Bu fonksiyon yalnızca fırçanın rengini belirlememize olanak sağlar. Prototipi:

            Uygulamanın menü yapısı:


            Uygulamada modeless dialog penceresinin içerisindeki scroll barların ID değerleri bilinçli olarak 10, 11, 12 biçiminde yani ardışıl olarak verilmiştir. Bunun nedeni dialog penceresine iletilen mesajların kolay işlenmek istenmesidir.
            Bir dialog penceresinin yeniden açıldığında en son görüntüyü koruması bazen istenebilir. Bunun için kontrol bilgileri çıkarken global değişkenlere atanır. WM_INITDIALOG mesajında da o değerlerle tekrar kontroller konumlandırılır.

IsDialogMessage API Fonksiyonu

            Modeless dialog pencereleri için ayrıca mesaj döngüsünün içerisinde IsDialogMessage API fonksiyonunun çağırılması gerekir. Eğer bu fonksiyon çağırılmazsa modeless dialog penceresi pek çok işlemini yapar ancak özellikle klavye ile ilgili işlemlerde başarısız olur. Bu fonksiyon mesajın modeless dialog penceresine ilişkin olup olmadığını tespit eder, eğer ilişkinse bazı ek işlemlerden sonra kendi içerisinde TranslateMessage ve DispatchMessage fonksiyonlarına sokar. Eğer kuyruktan alınan mesaj bir modeless dialog penceresine ilişkinse ayrıca TranslateMessage ve DispatchMessage fonksiyonlarına sokulmamalıdır. Fonksiyonun geri dönüş değeri 0 ise mesaj modeless dialog penceresine ilişkin değildir, o halde işlenmelidir. 0 dışı bir değer ise mesaj modeless dialog penceresine ilişkindir işlenmemelidir. Genellikle modeless dialog pencerelerinin handle değerleri global değişkenlerde saklanır. Başlangıçta bu global değişkenin içerisine NULL değeri koymak kontrol açısından uygundur. özetle bir modeless dialog penceresi açılacaksa programın mesaj döngüsü şöyle olmalıdır:


SetDlgItemInt ve GetDlgItemInt Fonksiyonları

            Bu fonksiyonlar aslında SetDlgItemText ve GetDlgItemText fonksiyonlarının başka biçimleridir. SetDlgItemInt fonksiyonu bir int sayıyı parametre olarak alır. Bunu yazısal biçime dönüştürerek SetDlgItemText ile pencere yazısını değiştirir. GetDlgItemInt fonksiyonu da pencere yazısını alarak bunu atoi fonksiyonundan geçirir ve bir int sayı biçiminde programcıya verir. Bu fonksiyonlar özellikle edit ve static kontrollerinde kullanılmaktadır.

Timer İşlemleri

            Eğer programcı isterse belirlenen bir periyodla kuyruğa WM_TIMER isimli mesaj Windows tarafından gönderilebilir. Bu sayede periyodik işlem gerektiren durumların üstesinden gelinebilir. Örneğin belirli aralıklarla bir işlemi yürüten programlar ya da saat programları bu mesajdan faydalanılarak yazılırlar. Mesajın yollanacağı periyod milisaniye mertebesinde belirlenebilir. Buradaki periyod uzunluğu sistemin çalışmasına bağlı olarak ileri ve geri yönde sapmalar gösterebilir. Zamana dayalı kritik işlemler bu mesaj kullanılarak gerçekleştirilemez. Sistemin WM_TIMER mesajını kuyruğa bırakabilmesi için SetTimer API fonksiyonuyla bir timer yaratmak gerekir. Prototipi:

);

Fonksiyonun birinci parametresi mesajın gönderileceği pencerenin handle değeridir. Fonksiyonun ikinci parametresi yaratılacak timer'ın ID değerdir. Eğer daha önce bu ID değeriyle bir timer yaratılmışsa eskisi silinerek yenisi geçerli olur. Bu değer genellikle sembolik sabit olarak tanımlanır. Bir programın birden fazla timer yaratması durumunda bu ID değeri timer'ların tespit edilmesi amacıyla kullanılır. Windows bir timer'ın zamanı geldiğinde kuyruğa WM_TIMER mesajını bırakır ve mesajın wParam parametresine ID değerini yerleştirir. Programcı da bir switch içerisinde mesajın hangi timer dolayısıyla gönderildiğini anlar. Bu değer aynı zamanda bir handle değeri gibi kullanılmaktadır. Örneğin timer yok edilirken bu ID değeri kullanılmaktadır. Fonksiyonun üçünü parametresi milisaniye cinsinden gönderilme periyodunu belirtir. Fonksiyonun son parametresi timer fonksiyonunun baişlangıç adresini alır. Bu değer NULL girilebilir. Bu fonksiyonun aşağıdaki gibi bir parametrik yapıya sahip olması gerekir:


            Fonksiyonun geri dönüş değeri başarı durumunda ikinci parametresiyle girilen ID değerinin aynısıdır. Başarısızlık durumunda 0'dır. Fonksiyonun başarısının kontrol edilmesinde fayda vardır.

WM_TIMER Mesajı

            Bu mesajın wParam parametresine timer'ın ID değeri, lParam parametresine ise SetTimer fonksiyonunun son parametresi olarak geçirilen fonksiyonun adresi yerleştirilir.
            Yaratılan timer çalışma bitirilince KillTimer fonksiyonuyla yok edilir. Prototipi:

            Örnek programda timer WM_CREATE mesajında yaratılmış, WM_DESTROY mesajında da yok edilmiştir.
            SetTimer fonksiyonun son parametresi NULL yerine belirtilen parametre yapısına sahip bir fonksiyonun başlangıç adresi olarak girilirse periyod dolduğunda doğrudan o fonksiyon çağırılır.Bu durumda WM_TIMER mesajı etkisiz kalır. Aslında bu durumda mesaj yine kuyruğa bırakılır, ancak DispatchMessage API fonksiyonu pencere fonksiyonunu çağırmak yerine bu fonksiyonu çağırır.
            SetTimer fonksiyonunun birinci parametresi de NULL girilebilir. Bu durumda son parametre mutlaka girilmelidir. DispatchMmessage API fonksiyonu belirtilen fonksiyonu çağırır.

Bir BMP Çizimi Yapmanın Adımları

1. Bitmap resource'ta çizilir, ya da FindResource fonksiyonuyla doğrudan dosyadan yüklenir. LoadBitmap fonksiyonuyla bitmap'e ilişkin handle elde edilir.
2. WM_PAINT içerisinde CreateCompatibleDC ile bellek için DC elde edilir ve SelectObject fonksiyonuyla bu DC için bitmap seçilir.
3. BitBlt fonksiyonuyla bellek tabalı DC'den normal DC'ye kopyalama yapılır.


Devamı... 2 Temmuz 2013 Salı Unknown 0 yorum

seo programında doğru alan

Görüntü Modu(Mapping mode)


işletim
            DC nesnesinin çizime ilişkin en önemli elemanı görüntü modudur. Default görüntü modeu MM_TEXT'tir. Aslında çizim yapılırken kullanılan x, y değerleri pixellere karşılık gelmek zorunda değildir. Bu koordinata mantıksal koordinat denir. GDI fonksiyonları bu mantıksal koordinatları gerçek pixel koordinatlarına dönüştürerek çizim yaparlar. Görüntü modu şunlar üzerinde etkili olmaktadır:

1. Mantıksal koordinatların pixel koordinatlarına dönüştürülme biçiminde etkili olur.
2. x ve y artımlarının hangi yöne doğru olacağı üzerinde etkili olur.
3. Orijin üzerinde de etkisi vardır.

MM_TEXT Modu

            Bir DC elde edildiğinde bu default moddur. Mantıksal koordinatlarla pixel koordinatları birebir örten biçimindedir. Yani (10, 10) noktası çalışma alanının sol üst köşesinden itibaren 10 pixel sağ ve 10 pixel aşağıda bulunan pixel'dir. Bu mod doğrudan pixel tabanlı olduğu için çözünürlüğün değiştirilmesinden çok fazla etkilenir. x, y arttırımı x sağa y aşağıya doğru yapılmaktadır.

MM_LOENGLISH ve MM_HIENGLISH Modları

            Bu iki mod da x arttırımları sağa doğru y arttırımları yukarı doğrudur. MM_LOENGLISH modunda mantıksal bir birim 0.01 inch'e, MM_HIENGLISH'te ise her bir birim 0.001 inch'e karşılık gelmektedir. Örneğin MM_HIENGLISH modunda (0,0)'dan (1000, 1000)'e bir doğru çizildiğinde (0,0)'dan 1 inch sağa 1 inch yukarı olacak şekilde bir doğru çizilmektedir. Tabii GDI sistemi gerçek bir inch hesabı yapamaz. Çünkü çizginin kaç inch olacağı çözünürlüğe ve ekranın büyüklüğüne bağlıdır(Bir çizimin kaç inch oduğunun belirlenebilmesi için kullanılan monitörün büyüklüğünün ve çalışılan çözünürlüğün bilinmesi gerekir. Çünkü bunlar bilinirse bir pixel'in genişliği ve yüksekliği bulunabilir. Buradan hareketle tam bir ölçü hesaplanabilir). Ancak Windows sisteminin monitör uzunluğunu otomatik olarak bilmesi tam olarak mümkün değildir. Bu yüzden buradaki inch gerçek bir inch büyüklüğünü ifade edemez. Aslında Control Panel içerisinde sistem fontunun ayarlarıyla oynanarak dolaylı bir biçimde monitör uzunluğu girilebilir.

MM_LOMETRIC ve MM_HIMETRIC Modları

            Bu iki modda mantıksal birim milimetre cinsinden belirlenmiştir. Arttırım x için sağa, y için yukarıya doğrudur. Bir mantıksal birim MM_LOMETRIC'te 0.1 milimettre, MM_HIMETRIC'te ise 0.01 milimetredir.

Kartezyen Koordinat Sisteminde Doğru Çizen Program


            Pencerenin herhangi bir bölgesine birbirini kesen iki doğru çizilebilir. Bunların kesişim noktsı view port origin olarak belirlenebilir. Görüntü modu için MM_TEXT uygun değildir. MM_LOMETRIC kullanılmıştır. Program bir doğru çizmektedir. menüden seçim yapıldığında bir dialog penceresi çıkar. (x1, y1) ve (x2, y2) noktalarını ister ve doğru MoveToEx ve LineTo fonksiyonlarıyla çizilir. Programın menü yapısı: File=>Exit, Graph=>Line. Görüntü modunu değiştirmek için SetMapMode fonksiyonu kullanılır. Prototipi:

Scroll Bar'ların Kontrolü

            Scroll bar'lar yatay ve düşey olmak üzere iki kısıma ayrılmaktadır. Bir scroll bar ya otomatik olarak pencerenin sağ ve alt köşelerine yerleştirilir ya da bir alt pencere gibi yaratılır. Pencerenin sağına ve altına otomatik yerleştirilen scroll bar'lar birer alt pencere değildir. Scroll bar üzerinde şu hareketler yapılabilir:

1. Scroll bar oklarına tek click yapılabilir.
2. Scroll bar düğmesinin herhangi iki tarafına tek click yapılabilir.
3. Scroll bar düğmesi üzerinde sürükle ve bırak hareketi yapılır.

            Scroll bar kontrolü bir alt pencere olarak "scrollbar" sınıfıyla yaratılabilir. Scroll bar üzerinde yukarıda tanılanan işlemlerden birisi tanımlandığında scroll bar üst pencereye mesaj gönderir(Kontrol olarak yaratılmışsa üst pencereye, pencereye gömülü olarak yaratılmışsa gömülü olarak yaratılmış olan pencereye mesaj gönderir).
            Scroll bar üzerinde işlem yapıldığında scroll bar düğmesi otomatik olarak ilerletilmez. Programcı SetScrollPos API fonksiyonuyla düğmeyi ilerletir. Scroll bar üzerinde işlem uygulandığında üst pencere diğer kontrollerde olduğu gibi WM_COMMAND mesajıyla çağırılmaz, WM_HSCROLL ve WM_VSCROLL mesajlarıyla çağırılır.

WM_HSCROLL ve WM_VSCROLL Mesajları


            Mesajın parametreleri şunlardır: Eğer mesaj alt pencere biçimindeki bir scroll bar'dan gönderilmişse lParam içerisinde alt pencerenin handle değeri bulunur. Pencere içerisine otomatik iliştirilmiş olan scroll bar'lardan gönderilmişse lParam içerisinde 0 bulunur. LOWORD(wParam) scroll bar üzerinde hangi işlemin uygulandığını anlatır ve şunlardan bir tanesi olabilir:

SB_LINEUP  Scroll bar yukarı(sol) ok tuşuna basma sonucu
SB_LINEDOWN      Scroll bar aşağı(sağ) ok tuşuna basma sonucu
SB_PAGEUP Scroll bar düğmesinin yukarısına(soluna) basma sonucu
SB_PAGEDOWN     Scroll bar düğmesinin aşağısına(sağına) basma sonucu
SM_THUMBPOSITION      Scroll bar düğmesi sürüklenip bırakıldıktan sonra
SB_THUMBTRACK            Scroll bar düğmesi sürüklenirken
SB_TOP         Klavye kullanımı için ayrılmıştır
SB_BOTTOM            Klavye kullanımı için ayrılmıştır

SM_TOP ve SB_BOTTOM yalnızca klavye kullanımı için düşünülmüştür. Eğer scroll bar alt pencere biçiminde yaratıldıysa girdi odağı scroll bar üzerine verildiğinde kalvyenin tuşları otomatik olarak şu mesajları gönderir:




Devamı... Unknown 0 yorum

seo alt işletmeli çalışma

ALT İŞLEMLİ ÇALIŞMA (THREAD MECHANISMS)

işletim

            Bir proses en azından bir alt işlem (thread) içerir. Bu alt işleme ana alt işlem (main thread) denir. Her alt işlem, sanki ayrı bir program gibi işletim sistemi tarafından çizelgeleme işlemine sokulur. (süresi 20 milisaniyedir.). Program WinMain fonksiyonunun bulunduğu ana alt işlemden çalışmaya başlar. CreateThread API fonksiyonuyla program içerisindeki bir fonksiyon, bir alt işlem olarak belirlenebilir. Yani artık, bu prosesin iki alt işlemi vardır. Her iki alt işlemde birbirinden bağımsız olarak, sanki farklı programlarmış gibi çalışabilirler. Alt işlemler arasındaki geçiş, ya aynı prosesin iki alt işlemi arasında ya da farklı proseslerin alt işlemleri arasında olabilir. Aynı prosesin alt işlemleri arasında yapılan geçişin performans maliyeti fazla deeğildir.

Alt İşlemler ve Prosesler Arsında Haberleşme

Bir prosesin iki alt işlemi asenkron çalışan iki ayrı fonksiyondur. Bunlar aynı prosese ilişkin oldukları için aynı global değişkenleri kullanabilirler. Ancak farklı proseslere ilişkin alt işlemler arasındaki haberleşmeye kısaca proseslwer arasındaki haberleşme (interproses com)denir.prosesler arsındaki heberleşme aynı makinadaki iki programın ya da Network içindeki herhangi iki makine arasındaki proseslerin haberleşmesi biçiminde iki bölümde incelenmektedir. Her iki yöntem için de farklı yöntemler kullanılmaktadır.


Bir Alt İşlemin Yaratılması

            CreateThread API fonksiyonuyla yapılmaktadır.

Fonksiyonun 1. Parametresi; alt işlemin güvenlik parametrelerine ilişkin bir yapının adresidir. NULL geçilebilir.
2. Parametre; bir alt işlemin kullanılacağı stack uzunluğudur. 0 girilirse, default bir uzunluğu alır.
3. Parametre; geri dönüş değeri void, parametresi LPVOID türünden bir fonksiyon göstericisidir. Yani bu parametreye alt işlem olarak tanımlanacak fonksiyonun adresi geçirilecektir.
4. Parametre; alt işlem olarak tanımlanan fonksiyona geçirilecek parametredir.
5. Parametre; yaratılan alt işlemin davranışını belirtir. Bu parametreye 0 girilirse, alt işlem yaratılır yaratılmaz çalıştırılır.
6. Parametre; DWORC türünden bir değişkenin adresini alır. Fonksiyon bu değişkene alt işlemin ID değerini yerleştirir.
Fonksiyonun geri dönüş değeri, yaratılan alt işleme ilişkin çeşitli bilgilerin saklandığı bir bölgenin adresi olan handle değerid

            Bir thread CreateThread API fonksiyonuyla yaratıldığında alt işlemin yönetilebilmesi için bir handle alınır. Bu alan CloseHandle API fonksiyonula silinebilir.Prototipi:


void WINAPI MyThread(..... stdcall) biçiminde çağırılmalıdır.

Bir alt işlemin çalışması ExitThread fonksiyonuyla sonlandırılabilir. Eğer bu fonksiyon çağırılmamışsa alt işlem fonksiyonunun sonunda derleyici tarafından otomatik olarak sonlandırılır. Prototipi:



Alt İşlemlerin Bekletilmesi


            Bir alt işlem Sleep fonksiyonuyla istenilen kadar milisaniye çizelge dışı bırakılabilir. Tabii bu bekleme işlemi çizelge dışına atılarak gerçekleştirilir. Meşgul bir döngü(busy loop) kullanılmaz. Prototipi:



            Bu fonksiyona 0 parametresi geçildiğinde kalan quanta süresi kadar bir bekleme oluşabilir(Yani sanki o quanta süresi bitmiş gibi işlem yapılır). Ancak Sleep fonksiyonu kodun içinde bulunan thread'i bekletebilir(Yani başka bir alt işlem bekletilemez). Başka bir alt işlemin bekletilmesi SuspendThread API fonksiyonuyla yapılmaktadır. Prototipi:


            Bu fonksiyon bir alt işlemin çalışmasını ResumeThread API fonksiyonu çağırılana kadar durdurur. Prototipi:



            Alt işlem kullanımına ilişkin örnek programın açıklanması:
Program kodu UNICODE uyumlu yazılmıştır. Ancak Windows 95 ve 98 sistemlerinde RegisterClass API fonksiyonu UNICODE sisteminde çalışmaz, sıfırla geri döner. Tabii Windows NT sistemlerinde böyle bir problem yoktur.

Alt İşlemler ve Mesaj Kuyruğu


            Bir alt işlem içerisinde CreateWindow ile pencere yaratıldığında o alt işleme ilişkim bir mesaj kuyruğu da yaratılır. Yani her alt işlemin farklı bir mesaj kuyruğu vardır.

Alt İşlemlerin Seri Hale Getirilmesi


            İki alt işlem asenkron bir biçimde çalışır. Ancak pek çok uygulamada belli bir eş zamanlılığın sağlanması gerekebilir. Örneğin paralel porta takılan bir aygıt beş satırlık bir kod ile iki alt işlem tarafından programlanıyor olabilir. Bir alt işlemde programlama işlemi başladığında alt işlemler arasında geçiş olur, akış diğer alt işleme gelirse o alt işlem de aynı programlayan kodu çalıştırırsa problemli bir durum ortaya çıkar. Çünkü tekrar bir alt işlemler arası geçiş ile program diğer alt işlemden devam ettiğinde alt işlem programlama adımlarının bazılarının yapıldığını sanarak kaldığı yerden devam eder. Oysa bu işlemler diğer alt işlemler tarafından bozulmuştur. Eğer bir kod bir bölgedeyse o kod o bölgeden çıkana kadar başka bir kodun o işlemleri yapan bölgeye girmesi istenmiyorsa o bölgeye kritik bölge denir(critical section). Kritik kod(bölge) işletim sistemlerinin sağladığı özel fonksiyonlarla ele alınmalıdır. Kritik kodların global değişkenlerle yaratılması mümkün değildir.



Bu işlem gerçekleştirilemez.

            Kritik kodların üstesinden gelebilmek için Windows işletim sisteminde çeşitli API fonksiyonları vardır. Örneğin:

CreateSemaphore
CreateEvent
CreateMutex

Bu API fonksiyonlarıyla bir handle alınır. Bu handle

ReleaseSemaphore
ReleaseEvent
ReleaseMutex

gibi API fonksiyonlarıyla bırakılır. WaitForSingleObject API fonksiyonuyla bekleme  alt işlem çizelge dışı bırakılarak yapılır.

            Örneğin Semaphore nesnesi şöyle kullanılır. CreateSemaphore fonksiyonu ile semaphore yaratılır ve bişr handle elde edilir. Handle içerisinde bir sayaç vardır. Bu sayacın ilk durumu CreateSemaphore fonksiyonuyla belirlenir. WaitForSingleObject semaphore nesnesinin sayaç değeri 0 ise bekler, 0 dışı ise beklemez ama 1 düşürür. ReleaseSemaphore ise sayacı bir arttırır. Yani kritik kod WaitForSingleObject ile ReleaseSemaphore arasındaki koddur. Semaphore nesnesi prosesler arasında bir isim verilerek de kullanılabilir.  

Grafik İşlemlerinde Görüntü Modu ve Koordinat Sistemleri

            Windows'da kullanılan orijin noktası 3 biçimde olabilir:

1. Ekranın sol üst köşesi orijin olabilir(Popup menu çıkartırken kullandığımız fonksiyonlar bu orijine ilişkindir).
2. Orijin pencere başlığının sol üst köşesi olabilir(GetWindowDC ile alınan handle orijin noktasının böyle olduğunu varsayarak çizim yapar).
3. Pencerenin çalışma alanının sol üst köşesi orijin noktası olabilir(Bütün GDI fonksiyonları bu noktayı orijin kabul eder).

            Windows'da GDI fonksiyonları için orijin nokası çalışma alanının istenilen bir noktasına çekilebilir. Çalışma alanının orijin belirten noktasına "View port origin" denilmektedir. View port origin noktası her zaman pixel cinsinden belirlenir. Orijin noktası SetViewportOrgEx fonksiyonuyla değiştirilebilir. Prototipi:

);

            View port orijini dışında yine pencere görüntüsünü kaydırmak amacıyla pencere orijin noktası değiştirilebilir. Yani pencere içerisindeki görüntü kaydırılarak istenilen bir DC bölgesinin pencere sınırları içerisinde kalması sağlanabilir. SetViewportOrgEx yalnızca çizim fonksiyonları için orijin noktasını değiştirir. Halbuki pencere orijininin değiştirilmesi yalnızca görüntünün kaydırlması anlamına gelir. Pencere orijinini değiştiren SetWindowOrgEx fonksiyonu vardır. Prototipi:


Devamı... Unknown 0 yorum

seo karakter tablolama sistemi

UNICODE Karakter Tablolama Sistemi


işletim
            ASCII tablosunda her karakter 1 byte yer kaplayacak biçimde tutulur. Bu durum ancak 256 değişik karakterin ifade edileceği anlamına gelir. Son yıllarda her bir karakterin 2 byte ile ifade edildiği UNICODE tablolama sistemi ASCII sistemiyle birlikte kullanılmaya başlanmıştır. UNICODE tablosunun ilk 256 karakteri ASCII tablosundaki karakterlerin aynsıdır. Bu tabloda dünyadaki bütün ulslara ilişkin harf simgeleri vardır.
            Bir UNICODE karakter C'de unsigned short int türüyle ifade edilir. Bu tür şimdilik her sistemde 2 byte uzunluğundadır. Windows.h içerisinde typedef unsigned short int wchar_t biçiminde ve typedef wchar_t WCHAR biçiminde iki typedef ifadesi vardır. C++'ta 1996 standardında wchar_t bir anahtar sözcüktür. wchar_t C++'ta 2 byte uzunluğunda işaretsiz bir tam sayı türünü belirtir. UNICODE bir yazı wchar_t türünden bir yazı içerisinde saklanabilir. C'de normal string'ler birer byte uzunluğunda ASCII değerleriyle belleğe yerleştirilirler. Bir string'in başına L getirilirse (L"string" gibi) UNICODE string elde edilir. Bu durumda derleyici string'in herbir karakterini iki byte uzunluğunda UNICODE karakter tablosuna uygun olarak yerleştirir. NULL karakter iki byte uzunluğunda 0 biçimindedir. Derleyici UNICODE string yerine wchar_t türünden bir adres yerleştirir. C'de çalışıyorsak bu adres unsigned short int türünden bir adrestir. C++'ta çalışıyorsak wchar_t türündendir. Örneğin:



UNICODE karakter sabiti de söz konusudur. UNICODE karaketre sabitleri L'a' biçiminde belirtilir. Tabii wchar_t türünden bir değişkene doğrudan bir ASCII karakter sabiti atanabilir(C'de farklı türden bilgiler birbirlerine atanabilir).


Ancak yine de okunabilirlik bakımından atamanın şu biçimde yapılması tavsiye edilir.



            Bir programın UNICODE ve ASCII version'larının kolaylıkla elde edilebilmesi için şöyle bir sistem düşünülmüştür:



            Eğer program içerisinde her zaman TCHAR ismi kullanılırsa windows.h include ifadesinin yukarısına #define UNICODE yazılıdğında bütün TCHAR'lar wchar_t yazılmadığında ise bütün TCHAR'lar char anlamına gelirler. Yani bütün program TCHAR ismini kullanacak biçimde yazılmalıdır. Tabii bir string'in de otomatik olarak UNICODE ya da ASCII string biçiminde kolay bir dönüştürmeye tabii tutulması gerekmektedir. Bu işlem TEXT makrosuyla yapılmaktadır.

            Bu makro windows.h içerisinde tanımlanmıştır. Görüldüğü gibi eğer UNICODE sembolik sabiti tanımlanmış ise TEXT("ali") gibi bir makro ön işlemci tarafından L"ali" biçimine dönüştürülür. Eğer UNICODE sembolik sabiti TEXT("ali") "ali" biçimine dönüştürülür. TEXT makrosu karakter sabitleri için de kullanılabilir. Sonuç olarak bir programı ASCII ve UNICODE uyumlu yazabilmek için:
1. char ya da wchar_t yerine her zaman TCHAR kullanılmalı,
2. UNICODE string ya da ASCII string yerine her zaman TEXT makrosu kullanılmalıdır.

Yazı Parametresi Alan API Fonksiyonları

            Bir yazıyı parametre olarak alan API fonksiyonlarından gerçekte iki tane vardır: ASCII ve UNICODE versiyonları. Örneğin, MessageBox fonksiyonundan iki tane vardır: MessageBoxA, MessageBoxW. Aslında 32 bit Wndows sistemlerinde 16 bit Windows sistemlerindeki gibi MessageBox isimli bir fonksiyon yoktur. MessageBox yazıldığı zaman ön işlemci, UNICODE sembolik sabitinin tanımlanıp tanımlanmadığına göre bunu MessageBoxA ya da MessageBoxW şekline döndürür. Tabii, bu fonksiyonların UNICODE versiyonlarında parametreler wchar_t * biçiminde ASCII versiyonları char * biçimindedir. Örneğin, MessageBox API fonksiyonu için windows.h içerisinde şu biçimde bir işleme sokulmuştur.


ASCII ve UNICODE Uyumlu Tür İsimleri

            Unıcode sembolik sabitine bağımlı olan iki tür ismi vardır. Yani bu durumda LPTSTR ve LPCSTR duruma göre wchar_t ya da char * olmaktadır. Aslında bu türler gösterimlerde daha çok iki versiyonu olan API fonksiyonlarının parametrelerini belirtmek için kullanılır.Örneğin MessageBox fonksiyonun prototipi şöyledir:
           
 Standart C Fonksiyonları ve UNICODE İşlemleri

            C’ nin standart string fonksiyonları (örneğin; strlen(), strcpy() gibi) default olarak ASCII sistemine göre çalışmaktadır. Bütün bu fonksiyonların ayrıcaUNICODE versiyonları da vardır. Ancak en iyisi bu fonksiyonların UNICODE duyarlı isimlerini kullanmaktır. UNICODE duyarlı isimler tchar.h dosyasında tanımlanmıştır. Bu yüzden bu dosyanın da include edilmesi gerekir. Ancak bu duyarlılık, UNICODE değil _UNICODE ismine göre yazılmıştır. Örneğin, tchar.h içerisinde şöyle bir _tcslen ismi strlen fonksiyonunun _UNICODE duyarlı biçimidir.


            Bunların dışında tchar.h içeriside TEXT makrosu gibi ancak _UNICODE sembolik sabitine duyarlı _T, __T,  _TEXT makroları da vardır. Sonuç olarak, durum biraz karışmış olmasına karşın, şu özet notlar alınabilir:

1.   UNICODE ve ASCII string elde etmek için TEXT, _T, _TEXT, __T makrolarının hepsi kullanılabilir.  ancak TEXT UNICODE sözcüğüne diğerleri ise _UNICODE sözcüğüne duyarlıdır. Tabii TEXT dışındakilerde tchar.h dosyasının include edilmesi gerekir.

2.   TCHAR türü UNICODE duyarlı bir türdür. Yani yalnızca windows.h dosyasının include edilmesiyle kullanılabilir.

3.   Bir yazıyı parametre olarak alan API fonksiyonlarından ASCII ve UNICODE olmak üzere ikişer tane vardır.

4.         Bir yazıyı parametre olarak alan Standart C fonksiyonlarının UNICODE versiyonları da vardır. Bunların _UNICODE duyarlı isimleri kullanılmaktadır
Devamı... Unknown 0 yorum

seo modüllerin tabloları

Modüllerin Import ve Export Tabloları


işletim
            Aslında exe ve dll dosyaları arasında ciddi bir fark yoktur. Yani bir exe dosyası dll dosyası gibi kullanılabilir. Dll dosyaları için söz konusu olan herşey exe dosyalar için de geçerlidir.

Export Tablosu

            Bir modüldeki bir fonksiyonun başka bir modül tarafından çağırılabilmesi için o fonksiyonun modülün export tablosuna yazılması gerekir. Örneğin bir dll dosyasının içerisinde 100 tane fonksiyon bulunsun. Eğer bunlardan yalnızca biri export tablosuna yazılmışsa başka bir modül yalnızca bu fonksiyonu çağırabilir. Tabii bu fonksiyon kendi içerisinde kalan 99 fonksiyonu çağırıyor olabilir. Export tablosunun genel yapısı aşağıdaki gibidir:


Export tablosu dışarıdan başka bir modül tarafından çağırılacak fonksiyonlar için fonksiyonların modül içerisindeki başlangıç adreslerini tutar. Örneğin func isimli bir fonksiyon bir dll içerisinde bulunsun ve bir exe dosyasından çağırılmış olsun. İşletim sistemi programın akışının bu fonksiyona geçirilmesi için bu fonksiyonun dll içerisinde nerede olduğunu bilmesi gerekir. işte bu bilgiyi dll dosyasının export tablosundan elde etmektedir.
            Fonksiyon isimleri export tablosuna alfabetik olarak sıralı bir biçimde yerleştirilir. Export tablosunda bir fonksiyonu hızlı bir biçimde bulabilmek için ikili arama(binary search) yöntemi kullanılır.  Tabloda fonksiyon ismi ve sıra numarası bir yapı biçiminde yani ikili kayıtlar biçiminde bulunur. Ancak fonksiyon adresleri sütunu bağımsız bir sütundur.

Export Tablosundaki Fonksiyonun Adreinin Tespit Edilmesi

            İsimden hareketle bir fonksiyonun adresi şöyle bulunur:

1. Fonksiyon ismi ikili arama yöntemi kullanılarak fonksiyon ismi sütununda aranır. Buradan fonksiyon adresinin sıra numarası elde edilir.
2. Bu sıra numarası fonsiyon adresi sütununa index yapılarak fonksiyon adresi çekilir.

            Arama işlemi def dosyası(module definition file) kullanılarak doğrudan sıra numarasına göre de yapılabilir. Bu durumda yalnızca fonksiyonun fonksiyon sütunundaki sıra numarası bilinir. Fonksiyon adresi doğrudan bu sütundan çekilir. Yani bir exportable fonksiyon fonksiyon ismi bilenerek ya da sıra numarası bilinerek aranabilir. Sıra numarası bilinerek yapılan arama çok daha hızlı bir sonuca ulaştırır. Export tablosuna yazılacak fonksiyonların isimleri ve sıra numaraları programcı tarafından belirlenebilmektedir.
            Export tablosundaki fonksiyonların adresleri modülün ilk byte'ın sıfır olacak biçimde göreli olarak düzenlenmiştir.

Import Tablosu

            Bir program içerisinde bir dll çağırılmışsa derleyici bunun makina kodunu CALL [adr] biçiminde yazar. Bu çağırma biçimine sembolik makina dilinde dolaylı çağırma(indirect call) denir. Bu makina komutu şu anlama gelmektedir: "Mikroişlemci adr ile belirtilen adrese git, orada fonksiyonun başlangıç adresi var. O adresi al ve fonksiyona atla".
            Import tablosunun genel biçimi aşağıdaki gibidir:


            Derleyicinin ürettiği köşeli parantez içindeki adresin değeri import tablosunun dolaylı adres sütununun satırlarını göstermektedir. Yani runtime sırasında dolaylı adres sütununda belirtilen adreslere programın akışı geçirilmektedir. Dolaylı adres sütunu yükleyici tarafından modüllerin export tablolarına bakılarak doldurulmaktadır. Bu durumda bir dll yüklenmesinde şunlar yapılmaktadır.

1. Yükleyici exe dosyayı yükler
2. Yükleyici dll dosyalarını yükler.
3. Yükleyici dll'lerin export tablolarına bakarak, fonksiyonların göreli adreslerini elde eder. Bu değerlere dll dosyalarının yükleme adreslerini ekleyerek gerçek adresleri bulur.
4. Yükleyici bu adresleri import tablosunun dolaylı adres sütunlarına yazar.

            Import ve export tablolarının her ikisi de hem dll dosyaları içerisinde hem de exe dosyaları içerisinde vardır. Bir dll dosyası içerisindeki fonksiyon başka bir dll dosyası içerisindeki başka bir fonksiyonu çağırabilir.

dllexport ve dllimport Bildirimleri

            Bir fonksiyonu başka bir modülden çağırabilmek için o fonksiyonun export tablosuna yerleştirilmesi gerekir. Bir fonksiyonu export tablosuna yerleştirmek için fonksiyon prototipinin başına __dllspec(dllexport) ifadesinin yerleştirilmesi gerekir. __declspec(dllexport) fonksiyon tanımlaması sırasında da kullanılabilir(Hem prototipte hem de tanımlama sırasında kullanılabilir). Başka bir modülün export tablosunda belirtilmiş bir fonksiyonun çağırılması için özel bir işleme gereksinim yoktur. Çünkü linker çağırılan fonksyonları programın diğer modüllerinde bulamazsa otomatik olarak dll içerisinde de arar. Ancak bir dll içerisindeki bir fonksiyonun çağırılması söz konusuysa bu fonksiyon prototipinin önüne __declspec(dllimport) ifadesini yerleştirmek linker'ın işini kolaylaştırır.

Bir DLL'in Kullanıma Hazır Hale Getirilmesi


            Bir dll bir kütüphanedir ve içerisinde fonksiyonlar vardır. Bir dll'e ilişkin kaynak dosya C ya da CPP dosyası biçiminde yazılabilir. Bir dll'in oluşturulabilmesi için en iyi yöntem x.h ve x.c biçiminde iki dosya kullanılmasıdır. x.h dosyası dll içerisindeki fonksiyonların prototiplerini barındırır. Bu dosya hem x.c dosyası içerisinden, hem de dll'i kullanan bir modül içerisinden include edilir. Bu dosya içerisindeki prototiplerin başında dll için derleme yapılıyorsa __declspec(dllexport), başka bir modülden kullanılıyorsa __declspec(dllimport) ifadelerinin yazılması gerekir. Bu durumda ön işlemci komutlarıyla x.h dosyasına hiç dokunmadan fonksiyon prototipinin başındaki ifadeyi dışarıdan değiştirebiliriz. Tipik bir dll başlık dosyası şöyle organize edilebilir:



Dll dosyası kendisi derlenirken __MYLIB__ define edilir, kullanım kodunda kullanılmaz.
            Bir dll oluşturabilmek için project menüsünden proje türü olarak "Win32 Dynamic Linked Library" seçilmelidir. Bir dll kendi başına çalışamaz. Oysa bir exe kendi başına WinMain fonksiyonundan çalışır. Bir dll derlendiğinde ve link edildiğinde geliştirme ortamı dll ve lib uzantılı iki dosya oluşturur. Lib dosyasına "Import Library" denir ve normal bir lib formatında değildir. Import library dosyasından dll kullanılırken faydalanılır.

/*-----dll.dsw-----*/

Bir Dll'in Uygulama İçerisinden Kullanılması

            Bir dll'i oluşturduktan sonra dll içerisindeki fonksiyonlar başka bir modülden çağırılabilir. Bir dll sırasıyla şu dizinler içerisinde aranır:
1. Exe dosyasının bulunduğu dizin içerisinde
2. O anda bulunulan dizin içerisinde. O anda bulunulan geçerli dizin eğer prompt içerisindeysek programın çalıştırıldğı dizindir. Ancak prompt içerisinde değilsek yani örneğin masa üstündeki bir simgeyi çift tıklayarak çalıştırmışsak ya da Windows Explorer aracılığıyla programı çalıştırmışsak manuel yöntemle belirlenebilir. Aslında bir exe programını çalıştıran CreateProcess isimli bir API fonksiyonu vardır. Bu API fonksiyonunun bir parametresi de geçerli dizini belirtir. Aslında masa üstünde ya da Windows Explorer içerisinde programı çalıştırmak istesek Windows'un kendisi de programı CreateProcess isimli API fonksiyonuyla çalıştırır. Yani mouse'un sağ tuşuna basılarak geçerli dizin set edildiğinde Windows bu bilgiyi CreateProcess ile programı çalıştırırken kullanır.
3. Windows dizininin altındaki System dizininde
4. Windows dizininde
5. Path ile belirtilen dizinlerde(Bu path autoexec.bat'taki path değildir)
6. Registry içerisinde özel bir yöntemle belirtilerek
            Dll uygun dizin içerisine çekildikten sonra dll'i kullanacak programın proje dosyası oluşturulur. Import Library dosyasını projeye dahil etmek gerekir. Bu sayede linker çağırılan bir fonksiyonun hangi dll içerisinde olduğunu tespit eder. Import Library'nin projeye dahil edilmesi "Add files to project" seçeneğiyle ya da "Project=>Settings=>Link=>Object/library" modules içine yazarak yapılabilir. Sonuş olarak şu işlemlerin yapılması gerekir:

1. Dll’in uygun bir dizine kopyalanması
2. Başlık dosyasının kullanılacak dosyadan include edilmesi
3. Import Library'nin projeye eklenmesi

            Import Library linker için, başlık dosyası derleyici için dll dosyası ise yükleyici için bulundurulmaktadır. Import Library ile aynı görevde olan bir def dosyası da vardır. Dll dosyasından Import Lıbrary ya da def dosyası elde edilemez.

DLL'lerin Sonradan Yüklenmesi

            Normal bir dll import library kullanılarak link edilmişse exe program yüklenirken işletim sistemi tarafından otomatik olarak belleğe yüklenir. Oysa bir dll dosyası programım çalışmasının herhangi bir aşamasında LoadLibrary API fonksiyonuyla yüklenebilir. Bir dll böyle kullanılacaksa projeye import library'i eklenmez.

Fonksiyonun parametresi yüklenecek dll dosyasının ismidir. Fonksiyonun geri dönüş değeri dll dosyasının yüklendiği bellek adresidir. Başarısızlık durumunda NULL değeriyle geri döner. Örneğin dll dosyası WM_CREATE mesajı içerisinde dinamik olarak yüklenebilir. Dosya ismi bir path ifadesi içerebilir. Eğer içeriyorsa dosya yalnızca o dizinde aranır, içermiyorsa daha önce belirtilen sırada aranır. LoadLibrary fonksiyonuyla yüklenen dll istenildiği zaman FreeLibrary fonksiyonuyla hafızadan çıkarılabilir.


Fonksiyon LoadLibrary fonksiyonundan elde edilen geri dönüş değerini parametre olarak alır ve dll dosyasını hafızadan çıkarır. Örneğin bu API fonksiyonu WM_DESTROY mesajında kullanılabilir.
            Bir dll LoadLibrary ile daha sonra yüklenmişse dll içerisindeki bir fonksiyonun çağırılması için o fonksiyonun adresinin runtime sırasında GetProcAddress API fonksiyonuyla elde edilmesi gerekir. Bu biçimde bir fonksiyonun çağırılabilmesi için fonksiyonun isminin ve parametrik yapısının bilinmesi gerekir. Ancak fonksiyon isimleri dll içerisine bazı nedenlerden dolayı değiştirilerek yazılmaktadır. Bu durumda bir fonksiyonun gerçek isminin elde edilmesi gerekir. Bu isim aslında programcı tarafından belirlenebilir, ya da Dumpbin programıyla:
Dumpbin /exports
seçeneğiyle elde edilebilir. Fonksiyon ismi yerine export tablosundaki sıra numarası da kullanılabilir. Sıra numaraları dumpbin programıyla ya da programcı tarafından hazırlanan def dosyası ile elde edilebilir. Dumpbin.exe programı sisteme ilişkin dosya formatlarını anliz etmeye yarayan Visual C++ paketiyle verilen özel bir programdır.

Fonksiyonun birinci parametresi LoadLibrary fonksiyonundan elde edilen handle değeridir. İkinci parametre fonksiyonun dll içerisindeki ismidir. İkinci parametre ile verilen adresin yüksek anlamlı iki byte'ı 0 ise fonksiyon düşük anlamlı iki byte'ında export tablosundaki sıra numarasının bulunduğunu düşünür. Böyle bir durumda bu parametre:


Devamı... Unknown 0 yorum

seo menü özel işlemi

Pulldown Menülerle Özel İşlemlerin Yapılması

işletim

            Bir programın menüsüne ilişkin popup menü handle'ları elde edilebilir. Örneğin bir programın ana menüsü içerisindeki bir menü elemanının "checked" yapılabilmesi için o menü elemanının ilişkin olduğu popup pencerenin handle değeri gerekir. Bir pulldown menü sisteminin bir popup penceresinin handle değerini elde edebilmek için GetSubMenu API fonksiyonu kullanılır. Prototipi:

HMENU GetSubMenu (

    
Fonksiyonun birinci parametresi pulldown menünün handle değeridir. Bu handle değeri menü LoadMenu ile yüklenirken elde edilen geri dönüş değeridir. İkinci parametre ilk popup menü sıfır olmak üzere menü sisteminin kaçıncı popup menüsünün handle'ının elde edileceğini bildirir. Fonksiyon pulldown menünün istenen popup menüsünün handle'ıyla geri döner.
            Bir pulldown menü herhangi bir biçimde yüklenmiş ise o menünün handle değeri GetMenu API fonksiyonuyla alınabilir.
            Bir pılldown menünün handle değeri kullanılarak da doğrudan herhangi bir popuptaki menü elemanı "checked" yapılabilir. Bunun için CheckMenuItem ya da EnableMenuItem fonksiyonlarında handle değeri olarak pulldown menünün handle değerini girmek gerekir. Ancak bu yöntemde MF_BYPOSITION belirlemesinin bir anlamı kalmaz. Pulldown menü WNDCLASS yapısının lpszMenuName elemanı set edilerek de açılmış olabilir. Bu durumda handle değeri GetMenu fonksiyonuyla alınabilir.



Kaynaktan Hareketle Popup Menü Açılması

            Popup menü elemanlarını kaynakta belirterek açma işlemi yapılabilir. Bunun için:
1. Kaynakta bir pulldown menü kaynağı oluşturulur.
2. LoadMenu ile handle elde edilir.
3. GetSubMenu fonksiyonuyla sıfırıncı popup menü elde edilir.
4. TrackPopupMenu ile menü görüntülenir.

            Aslında CheckMenuItem, EnableMenuItem, AppendMenu, InsertMenu fonksiyonları hem pulldown menü hem de popup menü sistemleri için çalışabilmektedir.

DLL Kullanımı

            DLL'ler Windows işletim sisteminin kullandığı dinamik kütüphane dosyalarıdır. İşletim sistemlerinde dinamki ve statik olmak üzere ikiye ayrılır. Statik kütüphane dosyalarının uzantısı lib, dinamik kütüphane dosyalarının uzantısı dll biçimindedir.

Statik Kütüphane Sistemi Nasıldır?

            Lib dosyaları obj modüllerden oluşmuştur. Obj modüllerinin içerisinde derlenmiş modüller vardır. Statik kütüphanelere ekleme fonksiyonlar düzeyinde yapılmaz. Fonksiyonlar bir obj dosya içinde bulunur, obj dosya kütüphaneye eklenir. Bir statik kütüphaneden fonksiyon çağırıldığında derleyici bu fonksiyonu obj modülü içerisine yazar, linker çağırılan fonksiyonu önce proje içerisindeki diğer modüllerde arar, eğer burada bulamazsa proje içerisinde belirtilen lib dosyalarında da arar. Linker bir fonksiyonu lib dosyası içerisinde bulursa fonksiyonun bulunduğu obj modülün hepsini exe dosyasının içerisine yazar. Statik kütüphane sisteminde çağırılan her fonksiyonun exe dosya içerisine yazılması Windows gibi bir sistemde etkin bir çözüm değildir. Örneğin eğer API fonksiyonları lib dosyalar içerisinde olsaydı, her program en azından en temel API fonksiyonlarının kodlarını exe dosya içerisinde içermek zorunda kalacaktı. Böylelikle disk kullanım oranı büyük ölçüde düşecekti. Bunun çözümü dinamik kütüphane sistemlerindedir.

Dinamik Kütüphaneler

            Dinamik kütüphanelerde tıpkı statik kütüphanelerde olduğu gibi fonksiyon barındırır. Ancak temel bir farklılıkları vardır. Dinamik bir kütüphaneden bir fonksiyon çağırıldığında linker kodu exe dosyanın içerisine yazmaz. Exe dosya içeirisinde özel bir bölüme fonksiyonun hangi dll içerisinde olduğunu yazar. Exe dosya çalıştırılacağı zaman Windows'un yükleyici programı exe dosya ile birlikte bu exe dosyanın kullandığı dll dosyalarını da belleğe yükler. Programın çalışma zamanı sırasında dll içerisinde bulunan fonksiyonların çalışması sırasında akış dll dosyasının içerisine girerek buradaki fonksiyonu çalıştırır. Windows işletim sisteminde belleğe bağımsız olarak yüklenebilen exe ve dll dosyalarına genel olarak modül denilmektedir.

Statik ve Dinamik Kütüphane Sistemlerinin Karşılaştırılması

1. Dll fonksiyonları exe dosyaları içerisine yazılmadığından exe dosyaların diskte kapladığı toplam alan azalır.
2. Dinamik kütüphane kullanan bir programın başka bir makinada çalıştırılabilmesi için exe dosyasının yanı sıra dll dosyalarının da taşınması gerekir.
3. Dinamik kütüphane sisteminin kullanılabilmesi için sistemin bir sanal bellek mekanizmasına sahip olması, yani genel olarak bellek probleminin olmaması gerekir. Çünkü bir dll'den birtek fonksiyon bile çağırılacak olsa bütün modül belleğe yüklenmek zorundadır.
4. Dinamik kütüphaneler bir programdaki kısmi değişikliklerin kolay yapılabilmesine olanak tanır. Yani exe dosyaya dokunmadan yalnızca yeni bir dll'in eskisiyle değiştirilmesiyle kısmi değişiklikler sağlanabilir.
5. Dinamik kütüphane kullanan bir programın yükleme zamanı göreli olarak daha uzundur.


            Windows'un tüm API fonksiyonları dll modülleri içerisindedir. API fonksiyonlarına ilişkin statik bir kütüphane yoktur. 
Devamı... Unknown 0 yorum

seo windows fonksiyonu

Get WindowRect Fonksiyonu


            Bu fonksiyon herhangi bir pencerenin koordinat bilgilerini elde etmekte kullanılır. Her zaman pixel birimiyle çalışır ve koordinat sistemi her zaman desktop'ın sol üst köşesine göredir. Prototipi:



            GetWindowRect fonksiyonunun orijin noktası bazı API fonksiyonlarıyla örtüşmeyebilir. Örneğin en tipik problem şudur: Bir alt pencere belli bir miktar öteleneceği durum.


Desktop orijinli bir noktanın herhangi bir pencerenin çalışma alanına göre koordinat  dönüşümünün yapılabilmesi için üst pencerenin desktop'a göre konumunun da bilinmesi gerekir. Bu dönüştürmeyi otomatik olarak yapan iki API fonksiyonu vardır: ScreenToClient, ClientToScreen.Prototipler:

            ScreenToClient fonksiyonunda fonksiyonun birinci parametresi pozisyonu belirlenecek pencerenin handle değeridir. İkinci parametre dönüştürülen koordinat bilgisidir.
            ClientToScreen fonksiyonunun birinci parametresi ilgili pencerenin handle değeri, ikinci parametresidesktop'a göre yeni parametre bilgileridir. Fonksiyonların birinci parametreleri dönüşümü yapılmak istenen pencerenin handle değeridir. Örneğin bir pencere içerisindeki (8,10) koordinatları pencerenin çalışma alanına göre konum belirtsin. Biz bu noktayı desktop'a göre konum belirtecek hale dönüştürmek istiyorsak fonksiyonu şöyle kullanmalıyız:


Pencere başlığı söz konusu ise GetClientRect ile aluınan koordinat pencerenin sol üst köşesine ilişkindir.

Popup Menü İşlemleri

            Herhangi bir yerde görüntülenebilen menülere popup menü denir. Programın ana menüsü aslında bir menü çubuğuna geçirilmiş bir grup popup menüden oluşmaktadır. Popup menünün bir elemanı başka bir popup menü olabilir. Popup menü elemanları aktif, pasif, gri ışıklı yapılabilir. Ya da herhangi bir menü elemanı "checked" yapılabilir. Popup menüler Windows programlarında genellikle mouse'un sağ tuşuna basıldığında görüntülenirler. Ya da genel olarak menü çubuğuna iliştirilmiş olarak bulunurlar. Popup menülerle çalışabilmek için önce işletim sisteminin popup menüsü için bir veri yapısı tahsis etmesi gerekir. Yani popup menüler normal bir handle mekanizmasındaki gibi çalışırlar. Bir popup menünün açılabilmesi için dört adımdan oluşan şu işlemlerin yapılması gerekir:

1. CreatePopupMenu API fonksiyonu ile popup menü için bir handle alınır.
2. AppendMenu ya da InsertMenu API fonksiyonlarıyla menüye eleman eklenir.
3. TrackPopupMenu API fonksiyonuyla popup menü görünür hale getirilir. 
4. Menü için alınan handle(yani işletim sisteminin tahsis ettiği bölge) DestroyMenu API fonksiyonuyla sisteme iade edilebilir.

            Genellikle CreatePopupMenu ve menüye eleman ekleme işlemleri WM_CREATE mesajında yalnızca bir kez yapılır. Bu durumda menü WM_DESTROY mesajında bırakılabilir(WM_DESTROY zaten programın bitmesi sırasında gönderildiğine göre bu işleme gerek olmayabilir). TrackPopupMenu fonksiyonu ise program içerisinde herhangi bir yerde, örneğin mouse'un sağ tuşuna basıldığında çağırılabilir.

Menülere Eleman Eklenmesi ve Insert Edilmesi


AppendMenu Fonksiyonunun Parametrik Yapısı


            Fonksiyonun birinci parametresi popup menünün handle değeridir. İkinci parametre menü elemanı olarak eklenecek bilginin nasıl bir bilgi olduğunu belirtir. Girilecek parametre değerlerinden bazıları şunlardır:

MF_STRING
Menü elemanı olarak bir yazı görüntülenecektir.
MF_BITMAP
Menünün bir elemanı bitmap olabilir. Bunu yapabilmek için bitmap çizilir ve kaynak dosyada belirtilir. Daha sonra LoadBitmap fonksiyonuyla yüklenir ve elde edilen handle değeri fonksiyonun üçüncü parametresinde verilir.
MF_CHECKED
Menü elemanı yanında checked şekliyle yaratılır.
MF_DISABLED
Menü elemanı pasif hale gelir. Pasif duruma gelmiş menü elemanı seçilemez, yani seçilmeye çalışılsa mesaj göndermez. Ancak rengi gri değildir.
MF_GRAYED
Menü elemanı pasif hale getirilir, rengi de gri gözükür. Böyle oluşturulmuş menü elemanı disabled menü elemanını işlevsel olarak kapsar. Her ikisinde de menü elemanı seçilemez, ancak grayed'de aynı zamanda elena gri olarak gözükür.


            AppendMenu fonksiyonunun üçüncü parametresi menü elemanı seçildiğinde WM_COMMAND mesajına gönderilecek menü ID değeridir. Eğer ikinci parametre MF_POPUP ise üçüncü parametre olarak popup menünün handle değeri girilmelidir. Dördüncü parametresi menü elemanı olarak görüntülencek yazıdır.

TrackPopupMenu Fonksiyonu



            Fonksiyonun birinci parametresi görüntülenecek popup menünün handle değeridir. İkinci parametre popup menünün hizalanma biçimdir. Üçüncü ve dördüncü parametreler menünün görüntüleneceği koordinat bilgisini içerir. Ancak bu koordinat bilgisi desktop orijinlidir. ClientToScreen API fonksiyonuyla koordinat bilgisini dönüştürmek gerekebilir. Beşinci parametre kullanılmamaktadır, sıfır girilmektedir. Altıncı parametre popup menünün üzerinde görüntüleneceği pencereninin handle değeridir. Aslında bu parametre WM_COMMAND mesjaının gönderileceği pencere fonksiyonunu  belirlemekte kullanılır. Fonksiyonun son parametresi kullanılmamaktadır, NULL girilmelidir.

Popup Menülerde Seçilme İşlemi


            Popup menüde bir seçim yapıldığında tıpkı normal ana menü işlemlerinde olduğu gibi WM_COMMAND mesajı LOWORD(wParam) menü elemanının ID değeri olacak şekilde çağırılır. Menü elemanının "checked" ya da disabled durumlarının kontrolü otomatik olarak yapılmaz, bu mesajlarda yapılmalıdır.


InsertMenu Fonksiyonu



             Bu fonksiyon bir menü elemanını popup menünün herhangi bir yerine ekleyerek yerleştirir. Fonksiyonun birinci parametresi ekleme işleminin yapılacağı popup menü handle değeridir. İkinci parametresi insert edilecek pozisyon numarasıdır. Bu değer sıfırdan başlar. Bu değer -1(0xFFFFFFFF) ise sona ekleme işlemi yapılır. Üçüncü parametre insert işleminin hangi ölçüte göre yapılacağını belirtir. MF_BYPOSITION insert işleminin ilk eleman sıfır olmak üzere pozisyon numarasına göre yapılacağını belirtir. Dördüncü parametre menü ID değeri ya da popup menü handle değeridir. Son parametre menü yazısını belirtir.

Menü Elemanlarının "Checked" Yapılması


            Menü elemanlarının checked ya da unchecked yapılması CheckMenuItem API fonksiyonuyla yapılır.


            Fonksiyonun birinci parametresi check işleminin yapılacağı popup menü elemanıdır. İkinci parametre check edilecek menü elemanının pozisyon numarası ya da ID değeridir. Check edilme işleminin neye göre yapılacağı üçüncü parametrede tespit edilir. Üçüncü parametre MF_CHECKED, MF_UNCHECKED biçiminde girilebilir. Bu değerlere ayrıca MF_BYPOSITION veya MF_BYCOMMAND | operatörüyle kombine edilebilir. Örneğin MF_CHECKED | MF_BYPOSITION. Default olarak bu parametre MF_BYCOMMAND seçilmiş gibi işlem yapılır. Fonksiyonun geri dönüş değeri menü elemanının önceki durumuna ilişkindir.
            Bir menü elemanının enable ve disable yapılması da benzer biçimde EnableMenuItem fonksiyonuyla yapılmaktadır
Devamı... Unknown 0 yorum