.Net Compact Framework 2.0 – Platform Invocation Services (PInvoke) – Ses Oynatıcı

Eylül 15, 2008 15:20 tarihinde ekinozcicekciler tarafndan eklenmistir.

.Net Compact Framework’ ün gelişimine baktığımızda özellikle2.0 versiyonu ile standart .Net Framework’ e epeyce yaklaşmış durumdadır. Yavaşyavaş birçok kavram .Net Compact Framework içerisinde de bulunmakta ; mobilcihaz uygulama geliştiricileri tatmin etmeye başlamaktadır.

Windows Mobile 6.0’ ında çıkmasıyla muhtemelen Microsoftyakın zamanda bir eklenti paketi çıkaracak ; yeni işletim sistemi üzerindegelen API’ lere managed ortamdan managed uygulama geliştiricilerin hizmetinesunacaktır. Olaya bu açıdan baktığımızda her ne kadar yeterli olduğunudüşünsekte, standart .Net Framework ortamında bile managed uygulamageliştiriciler olarak çoğu zaman birçok belirli eylemi gerçekleştirmek için managedsınıflardan yanıt bulamamakta ; çareyi unmanaged kütüphanelerin içerisindekimetotları managed ortamdan çağırarak bulmaktadırlar.

Peki bu sıkıntı .Net Compact Framework üzerinde nasılçözümlenmektedir ? Evet ; .Net Framework üzerinde olduğu gibi, managed mobilcihaz uygulama geliştiricilerde bu tip durumlarda soruna aşağı yukarı aynıçareyle çözüm bulmakta ; işletim sistemi üzerinde çalıştırılan birçok metodumanaged ortamdan çağırarak gerekli eylemleri gerçekleştirmektedirler.

Standart .Net Framework uygulamalarında Platform InvocationServices (PInvoke) adı verilen servisimiz üzerinden managed uygulama geliştiricler,Unmanaged kütüphanelerin içerisinde implement edilmiş bütün fonksiyonlarımanaged ortamdan çağırabilmekte ; platformlar arası tip dönüşümü v.b. gibi tümkarmaşık işlemleri PInvoke servisi gerçekleştirmektedir. Bu sistem, bazıkısıtlamalar ile .Net Compact Framework üzerinde “aynen işlemektedir”.

Makalemizin asıl konusuna geçmeden önce teorik anlamda bukonu ile ilgili bilgilenmek bu noktada daha doğru olacaktır. İlk olarak .NetCompact Framework üzerinde bu sistem sırasıyla nasıl çalışmaktadır ; nelereihtiyaç duymaktadır bu konular ile ilgili bilgi sahibi olalım.

.Net CF üzerinde Managed ortamdan Unmanaged bir kütüphaneiçerisindeki bir fonksiyonu çağırmak istediğimizde gerçekleştirilmesi gerekenbirkaç adım bulunmaktadır. Bu adımlardan sadece ilki ile uygulama geliştiriciilgilenmekte ; diğer adımlar PInvoke servisi üzerinden gerçekleştirilmektedir.

Managed ortamdan Unmanaged bir kütüphane içerisinde bulunanbir fonksiyonu çağırmak gibi bir ihtiyaç olduğunda ilk noktadagerçekleştirilmesi gereken eylem bu fonksiyonun hangi kütüphane içerisindehangi isimle bulunduğunu belirlemek olacaktır. Az sonra üzerinde çalışacakolduğumuz Attribute’ ün bizden istediği parametrelerin doğru bir şekildeverilebilmesi için bu değerler doğru belirlenmiş olmalı ; kütüphanemiz iseişletim sistemimiz üzerinde fiziksel olarak bulunmak durumdadır.

Fonksiyonun hangi parametreleri istediğini ; hangi kütüphaneiçerisinde bulunduğu gibi temel bilgileri internet üzerinden araştırdıktansonra artık gerçekleştirilmesi gereken tek bir adım kalmaktadır ; bu fonksiyonuPInvoke servisinin çalıştıracağı şekilde tanımlamak.

Bir sonraki adımda ise gerekli parametreleri tanımlı olan buunmanaged fonksiyona göndermek olacaktır. Gerekli platformlar arası dönüşümler,kontroller PInvoke servisi tarafından gerçekleştirilecek ; bize eğer geliyorise fonksiyon sonucu CLR tipinde geri dönüş değeri olarak gelecektir. İşte bukadar basit !

Peki az önce üzerinde konuştuğumuz ; metodumuzun PInvokeservisi tarafından alıgalanacak şekilde tanımlanması işlemini .Net CompactFramework üzerinde nasıl gerçekleştireceğiz ?

İşte bu noktada karşımıza sadece bu iş için oluşturulmuş birAttribute ; System.Runtime.InteropServices namespace’ i altında bulunanDllImport attribute’ u karşımıza çıkmaktadır.

DllImport ; adından da anlaşılabileceği üzere unmanaged birkütüphaneyi managed ortam üzerine taşımakla yükümlü bir attribute’ tur. Buattribute doğru noktada doğru parametreler ile kullanılabilir ise PInvoke metotçağırısını başarılı bir şekilde alabilecek ve bu şekilde iki farklı platformarası haberleşme gerçekleştirilmiş olacaktır.

.Net Compact Framework üzerinde PInvoke Servisleri ileilgili temel kısıtlamalar DllImport attribute’ u ile karşımıza çıkmaktadır. Bunoktada standart .Net Framework üzerinde onlarca değer alabilirken ; .NetCompact Framework üzerinde bu attribute sadece 3 adet parametre değerialmaktadır.

EntryPoint, CharSet, CallingConvention ve SetLastErrorşeklinde 4 adet sıralanabilecek bu parametre değerleri DllImport’ un PInvokeservisleri ile iletişim kurulacağı noktada sistemin çalışabilmesi için gereklideğerleri sağlamaktadır.

Bu parametre değerlerini göz önünde bulundurduğumuzda hayatiderecede önem taşıyabilecek en önemli parametre EntryPoint parametre değeriolacaktır. Çünkü bu parametre değeri içerisinde hangi kütüphane’ nin hangifonksiyonu çağırılacak ; bu bilginin değeri belirlenmektedir.

Lafı fazla uzatmadan hızlı bir şekilde makalemizin temelkonusuna odaklanalım. Amacımız standart .Net Compact Framework 2.0 sınıflarıile gerçekleştiremeyeceğimiz bir eylemi ; uygulamamız üzerinden ses çaldırmaişini PInvoke yardımıyla az sonra üzerinde konuşacağımız kütüphane içerisindekibir fonksiyonu ; PlaySound fonksiyonunu kullanarak gerçekleştirmek olacaktır.

Ayrıntıları proje esnasında geliştireceğimizden hiç vakitkaybetmeden bir C# Smart Device uygulaması açarak işe başlayalım.

Amacımız adresi verilen bir wave dosyasını form üzerineyerleştirilen button’ u kullanarak çaldırmak olacaktır. Bu noktada şekildekiform’ u tasarlamış olmak uygulamamız için yeterli olacaktır.

Şimdi geldik asıl ve zor olan bölüme. Bu noktada öncelikle gerçekleştirmemizgereken en önemli adım PlaySound fonksiyonunun hangi kütüphane içerisindebulunduğunu bulmak ; akabinde çalışabilmek için hangi parametre değerleriniistediğini bulmak olacaktır. Belirli bir araştırma sonucunda bu fonksiyonunişletim sisteminin kullandığı temel kütüphane ; CodeDll.DLL içerisindebulunduğunu ; ve çalışabilmek için 3 adet parametre istediği sonucunaulaşmaktayız.

http://msdn2.microsoft.com/en-us/library/aa909766.aspx

Parametreler sırasıyla ;

Çalınacak Dosyanın Adı, boş bir handle değeri ve az sonraüzerinde çalışacak olduğumuz bazı enum değerleri olmaktadır.

Yapmamız gereken ilk ve en önemli adımdan sonra sıra geldiikinci noktaya. Bu noktada DllImport attribute’ u yardımı ile bu unmanagedfonksiyonu doğru parametre değerlerini kullanarak çalışma zamanında tanıtmışolmamız gerekmektedir. Şekildeki kod ile uygulamamıza devam ediyoruz :

Kod üzerinden dikkat edilebileceği üzere System.Runtime.InteropServicesnamespace’ i altında bulunan DllImport Attribute’ üne ilk parametresindePlaySound isimli fonksiyonumuzun hangi kütüphane içerisinde bulunduğunubelirtmekteyiz. İkinci parametrede ise memory içerisine yüklenen kütüphane’ ninhangi fonksiyonunu araması gerektiğini belirtiyoruz –ki bu noktada yazımadikkat etmiş olmalıyız. Aksi takdirde fonksiyon bulunamayacaktır. Sonparametremizde ise bir hata oluştuğunda bunu PInvoke servisleri üzerindenmanaged ortama taşıyacağı bilgisini vererek string, IntPtr ve int alacakşekilde 3 parametreli bir fonksiyon deklare ediyoruz. Dikkat edilecek olursa sistem.Net Framework üzerindeki yapıyla birebir aynı çalışmaktadır.

Bir sonraki adımda ; fonksiyonun 3. Parametresinde kullanıcıdanistenen ; hali hazırda bazı statik değerlerden bahsetmek konunun tam olarakanlaşılabilmesi açısından daha doğru olacaktır.

Uygulama geliştiriciler bu fonksiyonu çağıracakları zamansistem üzerinde bu “sadece” fonksiyonun tanıdığı bazı özel numerik değerleri 3.parametre değeri olarak göndermeleri gerekmektedir. Bu hazır numerik değerlerindaha rahat kullanılabilmesi açısında bit flag tanımlamak bu noktada daha rahatolacaktır. Şekildeki kod bloğu üzerinden uygulamamamıza devam ediyoruz :

Statik olarak daha önceden belirlenmiş olan bu değerlereinternet üzerinden rahatlıkla ulaşılabilmektedir. Sistemin düzgün çalışabilmesiaçısından bu değerler Hexadecimal formatta belirlenmiştir. Ayrıca dikkatedilecek olursa tanımlanan her enum değerinin karşısına az önce bahsedilen “statik”değerler eşitlenmektedir. Bu şekilde fonksiyona tamamen bizden istediği vekendisinin kabul ettiği değerler gönderilmektedirler.

Hangi numerik değerin ne işe yaradığı yanında yorum olarakyazmaktadır.Bilindiği üzere bu tip parametri durumlarda araya OR ( | ) işaretikonularak birden fazla enum değeri gönderilebilmekte ; tek taşla birden fazlakuş vurabilmekteyiz. Biz makalemizde sadece tek bir enum değerini ; SND_FILENAMEdeğerini fonksiyona göndereceğiz. Böylece sistem fiziksel bir dosyadan okumayapacağını anlayacaktır.

Sıra geldi uygulamamızın son adımına ; şekildeki kod bloğuüzerinden uygulamamıza devam ediyoruz :

Dikkat edilecek olursak ; button’ a tıkladığımızdaMuzikCaldir metodu cagirilmakta ; parametre değeri olarakta dosya ismitxtPATIKA isimli metin kutusunun Text özelliğinden alınmakta ; ikinciparametreye boş bir IntPtr değeri gönderilmekte ve son flag parametre değerineise gönderilen patikanın bir “dosya patikası” olduğunu ifade eden SND_FILENAMEenum değeri gönderilemektedir.

Bu değerler üzerinden uygulamımızı çalıştırıyoruz veşekildeki patikayı yazıp Button’ a basıyoruz :

Ve sonuç mükemmel ! Uygulamayı emülatör yada fiziksel cihazüzerinde denediğinizde sesin çalındığını sizde rahatlıkla duyabilirsiniz.

Bu makalemizde PInvoke kullanarak Unmanaged bir kütüphaneiçerisindeki bir fonksiyonu .Net Compact Framework üzerinden çağırarak basitbir Ses Oynatıcısı geliştirdik.

Bir başka makalede daha görüşmek üzere.

 


4 kişi tarafından 2.5 olarak değerlendirildi

  • Currently 2,5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Yorum ekle




biuquote
  • Yorum
  • Canlı önizleme
Loading