AtasoyWeb - Hüseyin Atasoy
AtasoyWeb
Hüseyin Atasoy'un Programlama Günlüğü

Visual Basicte İşaretçiler (Pointerlar)

Visual Basicte işaretçiler için özel değişken tipleri olmadığı halde bazı API çağrıları işaretçi parametreler gerektirebilir...

İşaretçiler C ve türevlerinde genelde dinamik diziler oluşturmak amacıyla kullanılırlar ve VB6, özel işaretçi değişkenlere gerek bırakmayacak yerleşik komutlara zaten sahiptir (ReDim ve ReDim Preserve). Bu yüzden işaretçiler VB6da çok kullanılmadığı için pek göz önünde değildirler ve bir VB6 programcısının karşısına pek çıkmazlar...

Aslında işaretçilerin ne işe yaradıkları düşünüldüğünde bir dilin bu tip değişkenlere sahip olup olmadığı sorusu önemini yitirir. İşaretçiler bellek üzerindeki bir adresi işaret ederler. Yaptıkları tek şey adres bilgisi saklamaktır ve sakladıkları adres değerini basit long tipinde bir değişken içerisinde saklamak mümkündür. Dolayısıyla işaretçi değişkenlerin varlığından çok, asıl sorgulanması gereken şey referans ve dereferans operatörlerinin varlığıdır...

Referans operatörlerinin yerine geçebilen anahtar sözcüklere sahip olmasına rağmen VB6, bir işaretçinin işaret ettiği adres konumundan direkt olarak veri okuyamaz. Ancak sistem çağrıları ile hem adres alma hem de adresten okuma işlemleri gerçekleştirilebilir. Referans ve dereferans operatörlerinin görevi kernel32 kütüphanesinin RtlMoveMemory fonksiyonu ile yerine getirilebilir. Yöntem aşağıda örneklenmiştir...

Bazı sistem çağrıları parametre olarak bir işaretçi alabilir. Genelde bu parametreler "Any" tipinde tanımlanır. Any tipi, tip denetimini devredışı bırakır ve çağrılan fonksiyonlara herhangi bir değişkenin gönderilebilmesine olanak sağlar. VB6nın bu tip parametrelere adres yollayabilmesi için VarPtr, StrPtr veya ObjPtr fonksiyonları kullanılabilir. Bu fonksiyonlar C dilindeki & operatörünün görevini yerine getirir. Bu sayede adres alma işleminin gerçekleştirilmesi için RtlMoveMemory fonksiyonuna gerek kalmaz...

ObjPtr nesnelerin, VarPtr herhangi bir değişkenin adresini verir. StrPtr ise string tipli değişkenlerin adresini döndürür ve diğerlerinden farklı olarak, asıl konumdan 4 bayt sonrasını verir. Çünkü string tipli bir değişken, konumlandırıldığı yerin ilk 4 baytını uzunluğu belirtmek için kullanır. Ayrıca string tipli bir değişkenin her karakteri 2 bayt yer kaplar.

Private Declare Sub Kopyala Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, _
    Source As Any, ByVal Length As Long)

Private Sub Command1_Click()
    Dim a As Integer
    a = 5
    Dim Adresi As Long
    Adresi = VarPtr(a) 'Adresini alıyoruz.

    Kopyala ByVal Adresi, 56, 2 'Adresin bulunduğu konuma 2 baytlık veri yazdık.

    MsgBox a 'İşaretçinin işaret ettiği bölgeye yazdığımız veri değişkene de yansıdı.

    Dim b As Integer
    Kopyala b, ByVal Adresi, 2 'Dereferans operatörünün işlevini yerine getirtmiş olduk.

    MsgBox b
End Sub

Bunlar dışında bu konuda bahsedilmesi gereken ByVal ve ByRef anahtar sözcükleri var. ByVal değişkenin bir kopyasını oluşturur. ByRef ise değişkenin kendisini alır. C++ dilindeki kullanım ile karşılaştıracak olursak "ByRef degisken as integer" ifadesi C++'ta "int &degisken" ifadesine denktir...

Yazar: Hüseyin Atasoy
Posted: 13/07/2010 10:24
Keywords: vb6 işaretçilar, pointerlar, referans operatörü

Leave Comment

 
You are replying to comment #-1. Click here if you want to cancel replying.

 

Comments

No approved comment.
 
Şu an bu sayfada 1, blog genelinde 14 çevrimiçi ziyaretçi bulunuyor. Ziyaretçiler bugün toplam 2311 sayfa görüntüledi.
 
Sayfa 44 sorgu ile 0.008 saniyede oluşturuldu.
Atasoy Blog v4 © 2008-2024 Hüseyin Atasoy