Eylül 10th, 2009Visual Basic ile Api Kullanımı
Öncelikle Api nedir? yenilirmi/içilirmi bunu öğrenelim. Api’ler bizim alçak seviyeli programlama yapmaktan kurtaran birileri tarafından ;) C/C++ ile yazılmış program parçalarıdır.Visualbasic ile yazdığımız programlara biraz daha hız/taşınabilirlik katmamızı sağlarlar.Ayrıca visualbasic’te olmayan en basitinden cdroom’a erişme veya bellek miktarını öğrenme gibi konularda bize yardımcı olur.Api’ler dll veya ocx dosyalarının içine yerleştirilmişlerdir. Windowsun içinde kesin olarak bulunan 3 adet dll dosyası vardırLbir kontrol edin bakalım varmı ;)
1)User32.dll – Kullanıcı arayuzu ile ilgli komutlar(pencere işlemleri vs.)
2)Kernel32.dll – İşetim sisteminin çalışması(Windows serisi),dosyaların işlenmesi,hafıza yönetimi vb.Kısaca işletim sisteminin kalbi diyecegimiz kmoutlar bulur.
3)Gdi32.dll – Grafik ile ilgili komutlar bulunur
Dll nedir?:Windows system/system32 klasorunun altında bulunan bu dosyalar api’lerinin kalbi gibidir.Yukardaki dll’leride bu klasorler altında bulabilirsiniz.(kontrol ettinizmi ? ;)). DLL (Dynamic Link Library) yani dinamik link kütüphaneleri olarak isimlendirilen dosyalar Windows’un en önemli parçalarından birisidir. Bir DLL dosyası .exe gibi çalıştırılabilir bir programın icrası anında çağırabileceği fonksiyonları barındırmaktadır.
Yani diğer bir değişle dll, programların dinamik olarak bağlantı kurabileceği fonksiyonların bir kütüphanesidir.
Bağlantılar statik ve dinamik olmak üzere ikiye ayrılmaktadır:
1-) Statik bağlantılar icra sırasında değişmezler ve programınızın icrası sırasında kütüphane içindeki fonksiyonlara erişim için gerekli tüm adres bilgileri icra edilebilir dosya derlendiği sırada belirlenmiştir ve sabittir.
2-) Dinamik bağlantılar ise sadece gerektiği zaman kurulurlar. Eğer programınız ihtiyaç duyduğu bir
fonksiyonu kendi içinde bulamazsa o zaman Windows gerekli dll’i yükler ve içindeki fonksiyonları programınızın emrine verir.
bu kadar teorik bilgi yeterli J hadi uygulamaya geçelim.
Bir Api’yi kullanabilmeniz için önce declare(tanımlamanız) etmeniz gerekir.
1 2 3 | Private/Public Declare Sub/Function isim LİB “dll ismi” 'veya kutuphane ismi diyede gecer [((paremetreler))] [(veri tipleri(programda kullanılan tanımlamalar)] |
Artık bir api kullanalım… ;)
İlk aklıma gelen sürücüler oldu sürücü turlerini gösteren bir program oldu yazmaya başlayalım.Uppss bişey unuttuk api’ler nerde ;).Hemen görelim.
Visualbasic’mizi açalım ;

Eğer ilk defa kullanıyorsanız bu bolum belki yuklu olmayabilir.Herhangi bir eklentiyi yuklemek için;

Add-In Manager’ı kullanıcaz oraya tıklayın…

Tamam şimdi ApiView’mızı açalım;

Win32api.txt dosyasının yolu:c:\programfiles\microsoftvisual studio\common\tools\winapi\winapi32.txt
Forma bir tane drivelistbox,label koyun isimlerini kendinize göre belirlersiniz.İkinci programda module içinde kullanımını görelim şimdide sistem tarih/zamanı ögrenelim.(Şöyle diyenler olur time/date komutları ile zaten bunu öğreniriz ne gerek var api felan diye amacım api kullanımını ögretmek tabiî ki gidipte bunun için api kullanmaya gerek yok dimi yani ;).Bu apileri’yi cracker arkadaslar daha yakından tanır ;) time trial programlarda kullanılır.).Forma bir timer/2 label/2 textbox koyalım.Gerekli açıklamalar kod içinde….Benim yazıcaklarım bu kadar mumkun oldugunca kullanmaya bakın boylelikle programınızın ocx hatası azalır(ek olarak ters donusum muh. içinde bu api’leri sağlam bilmeniz gerekir ;).Hangi dil olursa olsun hepsinde aynı api’ler kullanlılır.Niye sizce?buda size kalsın.Birde handle nedir bir araştırın…) mesala commdilaog içinde api kullanabilirsiniz ilgli ocx’ eklemeden ;)
Selametle kalın
Program 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 'coded by hasan Option Explicit 'Gerekli api'yi deklare ettik.Burda dikkatedilmesi gereken private/public kısmı 'Eger bu api'yi bir modul içine yazsaydım pbaşına public yazmam gerekirdi 'aksi halde kullanamazsınız 'ikinci olarak dikkat ederseniz function yazdık yani bu api geriye bir deger 'dondurucek bu degerlerin ne oldugu tabiki bu api'yi yazan bilir :) biz nasil ogrencez? 'Bunları ister msdn'den ogrenin veya en kolayı api-guide isimli programdan 'ilgili degerler '1=DRIVE_UNKNOWN '1=DRIVE_NO_ROOT_DIR '2=DRIVE_REMOVABLE '3=DRIVE_FIXED '4=DRIVE_REMOTE '5=DRIVE_CDROM '6=DRIVE_RAMDISK bunlar Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long Private Sub dir_Change() 'Degişik surucu seçildiginde yazının degişmesi için change olayına yazdık Dim surucu As Long 'ilgili degişkeni tanımladık surucu = GetDriveType(dir.Drive) 'fonksiyonu bir isme atadaık Select Case surucu 'donen degerleri burda kontrol ettik Case 2 Drivetype.Caption = "Kaldırılabilir sürücünüz" Case 3 Drivetype.Caption = "Şuanda aktif olan sabit sürücünüz " Case 4 Drivetype.Caption = "Ağ üstündeki sürücünüz" Case 5 Drivetype.Caption = "Cd-rom surucunuz" Case Else Drivetype.Caption = "Bilinmeyen sürücü tipi" End Select End Sub |
Program 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | Option Explicit 'coded by hasan 'şimdi tanımlı api'miz nerde? bide modul içinde kullanıyım dedim gerekli acıklamalar 'ordada war şimdi buraya bakalım çok fazla birşey yok zaten özellikle az kod 'yazıyoumki olay basitleşsin yoksa kesinlikle üşendiğimden değil :D 'şimdi bu sub tipi bir api oldugu için geriye deger döndurmucek belli sabitlerimiz 'olucak onları visualbasic içindeki apiview ile ogrenebilirsiniz 'sub oldugundan direk çagırıcaz :) gelsin bilgilerimiz... Dim sysinfo As SYSTEMTIME Private Sub Form_Load() GetSystemTime sysinfo 'ilgili bilgileri cağrılıyor txtTarih.Text = sysinfo.wDay & "-" & sysinfo.wMonth & "-" & sysinfo.wYear End Sub Private Sub Timer1_Timer() GetSystemTime sysinfo 'bakın kodu özellikler farklı yere yazdım once 'bilgileri cagırıcaz sonra ekrana basıcaz :) txtSaat.Text = sysinfo.wHour & ":" & sysinfo.wMinute & ":" & sysinfo.wSecond & ":" & sysinfo.wMilliseconds End Sub 'Bu kısımdan aşağısı module'e eklenecek kod Option Explicit 'bakın module içinde kullanınca public yazdık herkes kullansın die :D Public Declare Sub GetSystemTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) 'ulaşabilecegimiz bilgilerde burada ilgil tipler bunları ister visualbasic 'içindeki apiview ile ister msdn istersenizde Api-Guide ile keyfiniz bilir 'Api-view açınca Apitype bolumunden "types" seçin 'sonra arama satırına SYSTEMTIME yazın pat çıkıcak :) Public Type SYSTEMTIME wYear As Integer wMonth As Integer wDayOfWeek As Integer wDay As Integer wHour As Integer wMinute As Integer wSecond As Integer wMilliseconds As Integer End Type |