IntPtr Tipi Pointer Değişkenler
C# kitabımı ilk kaleme aldığımda Google ile IntPtr kelimesini arattığımda pek bir şey çıkmamıştı. Yabancı site ve kitaplardan alınan bazı örneklerde IntPtr tipindeki pointer değişkenler kullanıldığı için Google birkaç yerli adresi işaret ediyordu. Bugün bir programcılık sitesinde Pointer’lar hakkında bilgi içeren 3 bölümlük makaleyi görünce merak edip baktım. Belki bu makalelerde IntPtr tipi Pointer’lardan söz edilmiştir diye. Makale üç bölüm olarak düzenlendiğine göre konu ayrıntılı olarak incelenmiştir diye düşündüm. Ne ki beklentim boşa çıktı ve arkadaşımız makalelerinde IntPtr’lere yer vermemiş.
Fırsat bu fırsat deyip tekrar Google ile tekrar arama yaptım. Listelenen adreslerden üç tanesinde bir forumda C# uygulaması dahilinde PrintScreen tuşu ile ekran görüntüsünü bir resim dosyasına kaydetmek isteyen bir üyeye verdiğim cevaptı. Forumdaki soruya verdiğim cevapta IntPtr tipindeki Pointer’lardan yararlanmıştım. Bu cevabım o günden sonra çok sayıda sitede örnek diye yer almaya başladı.
Google’ın işaret ettiği adresin birisi Levent Yıldız’ın kişisel sitesiydi. Levent Hoca her ne kadar yazdığı yazıdaki örneklerde IntPtr tipi Pointer’ları bolca kullanmış olsa bile amacı IntPtr’ler hakkında bilgi vermek olmadığı için sitesinde IntPtr’ler hakkında açıklayıcı bilgi bulamadım. Belki Levent bey göz açıp kapayıncaya kadar sitesine bir şeyler yazıp beni yanıltmış olur.
İşin özü: Aradan uzun zaman geçmesine rağmen kimse IntPtr’lerden söz etmemişti. Belki yakın bir zamanda yayınlanan C# kitaplarında IntPtr’lerden söz edilmiş olabilir. Son olarak şunu söyleyeyim: Bunları yazmama neden olan 3 makalenin yazarı makalelerinin sonunda yararlandığı kaynakları sıralamış. Tahmininizde yanılmadınız; bu kaynakların içinde Memik YANIK’ın yazdığı C# kitabı elbette yoktur. Bu tespitten sonra aşağıda verdiğim metni C# kitabımdan alıp perfectgate.net üyeleri ile paylaşmak istedim. Doğrusunu söylemek gerekirse C# kitabımda IntPtr’ler hakkında yeteri kadar bilgi olduğunu söyleyemem. Belki zaman ayırıp bu konuda makale yazmak gerekir.
NET uyumlu program geliştirme araçlarında Pointer değişkenlerin kullanılması önerilmiyor. Her şeye rağmen Pointer değişken kullanılmak istendiğinde ise Pointer değişkenlerin kullanıldığı metot veya fonksiyonların Unsafe olarak işaret edilmesi gerekiyor. Diğer yandan .NET uyumlu program geliştirme araçlarında IntPtr adında özel bir Pointer değişken bulunmaktadır. IntPtr tipindeki değişkenler daha çok Windows’un API fonksiyonları kullanılmak istendiğinde işlevsel olmaktadır. Örneğin Windows’un aşağıda yapısı verilen GetPixel() fonksiyonun HDC tipinde bir parametresi bulunmaktadır. Visual C# projesi dahilinde bu fonksiyon kullanılmak istendiğinde bu parametrenin IntPtr tipinde olması gerekiyor.
-
COLORREF GetPixel
-
(
-
HDC hdc, // handle of device context
-
int XPos, // x-coordinate of pixel
-
int nYPos
-
); [/php]</p>
-
<p>IntPtr tipindeki değişkenleri kullandığınız yerleri Unsafe olarak işaret etmek zorunda değilsiniz. Bu değişkenlerin nasıl tanımlanıp bilgi aktarıldığını aşağıda görebilirsiniz. Bu kodda önce IntPtr değişken tanımladım ve değişkeni yapılandırıcı metodu ile oluşturup değer aktardım.</p>
-
<p>[php]int i, j;
-
i= 100;
-
System.IntPtr Ptr;
-
Ptr = new System.IntPtr(i);
-
j = Ptr.ToInt32();
-
textBox1.Text = Convert.ToString(j);
IntPtr sınıfının yapıcı metodu Int32, Int64 veya Pointer bir değişkeni parametre olarak alabilmektedir. IntPtr tipindeki değişkeni veya nesneyi oluşturduktan sonra içeriğini Integer değişkene, oradan TextBox’a aktardım.
Aynı IntPtr değişkene başka bir değeri aktarmak istiyorsanız yapıcı metodunu tekrar kullanabilirsiniz. Yukarıda verilen kod işletildiğinde TextBox’a 100 yazılır. IntPtr değişkeni tanımlayıp sıfır değerini aktarmak istiyorsanız Zero özelliğini kullanabilirsiniz. Bu nedenle aşağıda verilen kod işletildiğinde TextBox’a 0 aktarılır.
-
private void Form1_Click(object sender, EventArgs e)
-
{
-
Ptr = System.IntPtr.Zero;
-
textBox1.Text = Ptr.ToString();
-
< }
Şimdi ise Pointer bir değişkeni IntPtr değişkenin yapıcı metoduna parametre olarak vereceğim. Aşağıda verilen kodu incelerseniz Pointer değişkenleri hatırlamış olursunuz.
-
private void Form1_Click(object sender, EventArgs e)
-
{
-
unsafe
-
{
-
int i;
-
int* Ptr;
-
IntPtr Ptr_int;
-
i = 100;
-
Ptr = &i;
-
Ptr_int = new System.IntPtr(Ptr);
-
textBox1.Text = Ptr_int.ToString();
-
Ptr_int = new System.IntPtr(*Ptr);
-
textBox2.Text = Ptr_int.ToString();
-
}
-
}
Bu kodda int, pointer ve IntPtr tipinde 3 değişken tanımladıktan sonra integer değişkene 100 sayısını ve pointer değişkene ise integer değişkenin adresini aktardım. Devamında Pointer değişkeni IntPtr sınıfının yapıcı metoduna parametre olarak verdim. Tanımladığım IntPtr değişkenin adresini formdaki ilk TextBox’a yazdıktan sonra IntPtr değişkenin içeriğini 2. TextBox’a aktardım.
Yazdır
| 832 Görüntülenme | Kategori: C Sharp, Programlama |
Geri İzleme
Etiketler: kaynak, makale, c sharpBenzer Yazılar
Yorum Yap
XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

30 Eylül 2007 |




Henüz yorum yapılmamış.