Api Nedir?

"İşletim sistemleri", aslında birer programdır. İşletim sistemleri genelde assembly programlama dili ile (veya assebmly komutları kullanan başka bir dil ile) yazılır. Bilgisayar açıldığında bir takım kontrol ve test işlemlerini yaptıktan sonra, harddiskin (durumuna göre floppy veya CD'de olabilir) ilk sektöründeki bilgiyi okur ve kontrolü işletim sistemine devreder. İşletim sistemi, bios kesmeleri ve makina dili komutlarını (assembly) kullanarak sistemi yönetir. Bu nedenle işletim sistemi direk olarak assembly komutları ile yazılmak durumundadır.

İşletim sistemleri, kendi kontrolleri altında çalışacak diğer programlar için uygun ortamı hazırlarlar. Söz gelimi bir program diske yazma, diskten okuma, ekrana yazma, klavye tuş vuruşunu izleme gibi bir çok işlemleri kendisi yapmaz. Bu işleri işletim sisteminden talep eder. Bu istemin geçerli olması için, işletim sistemi ile programın aynı dili konuşuyor olması gerekir. Oysa işletim sistemi ile aynı dilden konuşmak oldukça zor ve zahmetli bir çalışma gerektirir. Bu karşılık bu talepleri konuşulan dile daha yakın bir şekilde ifade etmek için aracı bir programa ihtiyaç duyulmuştur. Programların işletim sisteminden olan taleplerini basitleştirmek ve daha anlaşılır kılmak için yapılan programlara ise "programlama dili" denilmektedir.

Programlama dilleri sundukları bu kolaylığın bedeli olarak, biraz hızı düşürürler. Hatta, diyebiliriz ki; programlama dili ne kadar anlaşılabilir, konuşulan dile ne kadar yakınsa ve kodlanmaları ne kadar kolay iseler, o kadar yavaş çalışırlar. Bütün zamanların en anlaşılır ve en kolay dili olan basic serisi (basic, gwbasic, Qbasic, quick basic vs.) programlama dillerinin yavaşlığı bundan gelmektedir. Visual basic'in ise yeterince hızlı olduğunu belirtelim.

Programlama dilleri hiç bir zaman, işletim sisteminin bütün desteğini sağlamazlar. Örneğin; harddisk seri numarasını öğrenme gibi. Bazen işletim sisteminin dahi sağlamadığı bir işi programınıza yaptırmak istersiniz. Örneğin seri veya paralel port yardımıyla neon ışıkları yakılması gibi projeler. Bu nedenlerle yaptığınız programla, programla dilinin içinden, ama programla dili komutları kullanmadan, direkt olarak işletim sistemiyle, hatta direkt olarak merkezi işlem birimi (cpu) ile veya başka bir aygıtla çalışmak isteyebilirsiniz.

Windows serisi işletim sistemlerinde bu amaçla geliştirilmiş harici fonksiyonlar vardır. Bunlara Application Programming Interface ya da kısaca API denir.

Windows'un sunduğu bu API'ler gruplandırılarak bir çok DLL ve EXE dosyasına konmuştur. VB'de kullanılan OCX dosyalarında da API'ler bulunabilir. Bu API'lerden birini kullandığınızda API'nin bulunduğu DLL sisteme daha önce yüklenmemişse önce bu DLL yüklenir ve API çalıştırılır.

API'ler sadece Visual basic ile değil, windows altında çalışan her programlama dili içinden kullanılabilir. Siz de içinde değişik fonksiyonlar bulunan DLL dosyası yazabilirsiniz, ama bu API olmaz, API işletim sisteminin bir parçasıdır. API'de kullandığınız bir fonksiyonun, işletim sisteminin yeni versiyonlarında da yer alması sorumluluğu bulunmaktadır. API'lerin bir başka özelliği ise son derece hızlı olmalarıdır.

Visual Basic ile birlikte gelen "API Text Viewer" programı vasıtasıyla hemen hemen bütün API'lerin listesini görebilirsiniz.

VB'de API'ler, fonksiyon veya yordam olarak iki farklı şekilde tanımlanabilir.

Declare Sub isim Lib "apidosyaadi" (parametreler)

Yukardaki "Sub" yerine "Function" yazarsanız API'yi yordam olarak değil fonksiyon olarak çağırmak istyorsunuz demektir.

Yine yukardaki örnekte, "Declare" kelimesinde önce eğer form içinde kullanılıyorsa "Private" sözcüğü mutlaka kullanılmaldır. "Private" sözcüğü bu fonksiyon ya da yordamın kullanıldığı form veya modül için özel olduğunu, "Public" veya "Global" sözcüğü ise programın her tarafında geçerli olduğunu bildirir. Salt "Declare" kullanılırsa bu "Public" anlamına gelir. API'nin tanımlanacağı yer formun veya modülün General-Declerations kısmıdır. API'yi bir formun decleration kısmında tanımlarsanız "Private" yazmak zorunda olduğunuzdan dolayı API'yi yalnız o formun içinden çağırabilirsiniz.

API'yi doğru olarak tanımladığınız halde VB, ilgili dosyada böyle bir API bulunmadığını söylüyorsa veya API ile aynı isme sahip bir VB komutu var ise bu durumda Alias isimleri kullanmanız gerekir. Bazen'de API isminin sonuna A ekleyerek Alias ismi olarak vermeniz gerekir.

Örnek olarak; kullanıcı ismini bulan bir API fonksiyonu kullanalım. Yeni bir projeye başlatın ve formunuzdaki, bütün kodlar aşağıdaki gibi olsun.

Option Explicit

Private Declare Function apiUserName Lib _
"advapi32.dll" Alias "GetUserNameA" _
(ByVal lpBuffer As String, _
nSize As Long) As Long

Private Sub Form_Load()
Dim Bufstr$, Uz&, Sen$
Uz = 250
Bufstr = Space$(Uz)
If apiUserName(Bufstr, Uz) > 0 Then
Sen = Left(Bufstr, Uz - 1)
Sen = Trim(Sen)
End If
MsgBox ("Kayıtlı kullanıcı:" + Sen)
End Sub

Programı çalıştırdığınızda kullanıcı adını (yani kendi adınızı) görmeniz gerekir.


Gürol Demir
Vergi Denetmeni

1 yorum

API Nedir?

İşletim sistemlerine duyulan ihtiyaçlardan biri standart olarak her program tarafından yapılması gereken şeyleri ortak bir çatı altında toplamak ve programları sistemde belirli kurallar altında çalışmasını sağlamaktır. İşletim sistemlerinin değerini anlamak için işletim sistemi olmayan bir bilgisayar düşünün.

Yaptığınız programları diske kaydetme ihtiyacınız var. İşletim sisteminiz yoksa programlarınızı diske yazacak ve okuyacak assembly kodları sizin yazmanız gerekecektir. Ve her program diske yazma ve okuma kodlarını içinde bulundurmak zorunda olacaktır. Ayrıca diske yazacağınız programı diskin neresine yazacaksınız. Tabi ki herkes kendi programının başa yazılmasını isteyecektir. Bu da diski paylaşım sorununu çıkaracaktır. Ayrıca yazıcı için de problem vardır. Her yazıcı aynı sistemle çalışmayacağı için programınızda yazdırma işlemleri de varsa belli başlı yazıcı tipleri için gerekli kodları yazmanız gerekecektir. Bu örnekler çoğaltılabilir.

İşte PC'ler ilk çıktığında disk işlemlerini kolaylaştırmak için DOS ta piyasaya çıktı. DOS disk işlemlerini yapmak için yazılım interruptlarını programcıların hizmetine sunmuştu. Diskle ilgili bir işleminiz için INT X'in Y numaralı servisini çağırıyordunuz ve bu işlemleri sizin yerinize DOS yapıyordu. Sistemler geliştikçe bilgisayar değişik alanlara da hitap etmeye başlayınca çok değişik arabirimler de çıktı. DOS'a grafik, yazıcı işlemleri gibi standart işlemler de eklendi ve sistemde bulunan standart donanımların hemen hemen hepsine DOS veya BIOS interruptlarıyla erişebiliyordunuz. Ayrıca DOS programların belleği nasıl kullanacağını da belirliyordu. DOS işletim sistemi olarak kullanıcıya herhangi bir standart arabirim sunmamıştır. Sadece programların sistemdeki standart donanımlara ulaşabilecekleri kodları kullanıcıya sunmuştur. DOS'ta yapılan programların hiçbiri bir birine benzemez. Her program kendi kullanıcı arayüzünü belirlemek zorundadır ve bunun için gerekli kodu kendisi yazmak zorundadır. DOS'ta yapılan programların kullanım ve programlanmasının zorluğu da bir ölçüde buradan kaynaklanır.

DOS'un programlara standart bir arabirim sunmaması, bellek sınırlarının olması gibi sebeplerden dolayı çok çok geç kalmış olsada Windows çıktı. Windows DOS'un sağladığı standart donanıma ulaşma haricinde Ses kartları, Gelişmiş yazıcılar, Scanner'ler gibi donanımların kullanımını da programların kullanımına sunar. Ayrıca programlara standart arabirimleri (Diyalog kutuları, Formlar, Kontroller gibi) kullanma imkanı da sunmuştur. DOS kendi servislerini yazılım interruptlarıyla sunarken Windows API'lerle sunar.

Şimdi şöyle bir şey düşünülebilir. DOS'ta çok program yaptım ama diske birşey yazdırmak için DOS'un interruptlarını kullanmaya hiç ihtiyaç duymadım. Evet eğer assembly program yazmadıysanız bunlara da ihtiyacınız yoktur. Çünkü kullandığınız programlama dili bu işi sizin yerinize yapıyordu. Bu VB'de yaptığınız programlarda da böyledir. API kullanacaksınız diye bir şart yok VB bunları sizin yerinize kullanır. Ancak DOS'taki programlama dillerinde olduğu gibi VB'de de programlama dilinin sunduğu işlemler her zaman işinizi görmeyebilir, bu durumda Windows API'lerini kullanma ihtiyacı duyarsınız.

Basic herhalde bütün zamanların en yavaş programlar üreten dili olma özelliğini kimseye kaptırmak istemiyor. Quick Basicte yaptığınız bir program, aynı işi yapan C ile yapılmış programdan en az 5 kat daha yavaş çalışacaktır. Bu fark GWBasic'te daha da büyüktür. VB'de de durumun iç açıcı olduğunu iddia etmek çok güç. Programlarınızda API kullanmanız bu hız barajlarını aşmanızı sağlayacaktır. Ayrıca VB'nin sunmadığı bazı işlemler için de API kullanmak gerekir. Örneğin sistemdeki boş bellek miktarını verecek herhangi bir komut VB'de bulunmaz bunu da yine API kullanarak öğrenmek zorundasınız.

Windows'un sunduğu bu API'ler gruplandırılarak bir çok DLL ve EXE dosyasına konmuştur. VB'de kullanılan OCX dosyalarında da API'ler bulunabilir. Bu API'lerden birini kullandığınızda API'nin bulunduğu DLL sisteme daha önce yüklenmemişse önce bu DLL yüklenir ve API çalıştırılır.

Programınızda API kullanmak için Declare deyimiyle API'yi tanımlamanız gerekir. Bu tanımdan sonra tanımladığınız API'ye bir fonksiyon veya bir altprogram gibi ulaşabilirsiniz.

VB'de API Tanımı



VB'de API'ler iki şekilde tanımlanabilir. Fonksiyon veya altprogram olarak. Fonksiyon olarak tanımlanan API'lerden geriye bir değer dönerken, altprogram olarak tanımlananlardan bir değer geri dönmez.

Alt program olarak API tanımı:


Private/Public Declare Sub isim Lib "libname" [([parametreler])]


Fonksiyon program olarak API tanımı:


Private/Public Declare Function isim Lib libname [([parametreler])] [As tip]


Burada isim fonksiyonun ismidir ve programda API bu isimle çağrılır. Libname kullanılan kütüphanenin ismi, parametreler; fonksiyona giren parametreler, As tip; fonksiyondan dönen değerin tipidir.

API'nin tanımlanacağı yer formun veya modülün General-Declerations kısmıdır. API'yi bir formun decleration kısmında tanımlarsanız API'yi yalnız o formun altprogramlarından çağırabilirsiniz. Bir modülde tanımlarsanız programınızın her yerinde kullanabilirsiniz.

API'yi doğru olarak tanımladığınız halde VB, ilgili dosyada böyle bir API bulunmadığını söylüyorsa veya API ile aynı isme sahip bir VB komutu var ise bu durumda Alias isimleri kullanmanız gerekir.


Private/Public Declare Function/Sub isim Lib libname Alias "isim" [([parametreler])] [As tip]


API'yi doğru olarak tanımladığınız halde VB, ilgili dosyada böyle bir API bulunmadığını söylüyorsa API isminin sonuna A ekleyerek Alias ismi olarak vermeniz gerekir. Bunun sebebi Windows işletim sisitemi farklı dilleri desteklemektedir. ANSI karakter setini destekleyen ülkler için sonuna A harfi, UniCode veya iki karekter genişliğini kullanan ülke seti için ise sonuna W harfi eklemeniz gerekir.

API tanımı yaparken kullanacağınız tiplerin isimlerini ise C'den VB'ye çevirmeniz gerekir. Genel olarak tip karşılıkları şöyledir.
C Visual Basic
atom ByVal değişken AS integer
bool ByVal değişken As Long
byte ByVal değişken As Byte
char ByVal değişken As Byte
colorref ByVal değişken As Long
dword ByVal değişken As Long
hwnd,hdc,hmenu vb ByVal değişken As Long
int,uint ByVal değişken As Long
long ByVal değişken As Long
lparam ByVal değişken As Long
lpdword değişken As Long
lpint,lpuint değişken As Long
Iprect değişken As type
Ipstr,Ipcstr ByVal değişken As String
Ipvoid değişken As Any
lpword değişken As Integer
lresult ByVal değişken As Long
null değişken As Any veya ByVal değişken As Long
short ByVal değişken As Integer
void Sub procedure
word ByVal değişken As Integer
wparam ByVal değişken As Long
16 bit ByVal değişken As Integer
32 bit ByVal değişken As Long
float ByVal değişken As Single
double ByVal değişken As Double


Parametrelerden biri iki farklı tipte değer alabiliyorsa bunu As Any olarak tanımlamanız gerekir. Hangi parametrenin Any olarak tanımlanması gerektiğine ancak dosyadaki bilgileri okuyarak anlayabilirsiniz. Örneğin bir parametre hem string içerebiliyor ve hemde Null içerebiliyorsa bu parametre Any olarak tanımlanmalıdır.
Yaptıkları işlere göre API'lerin bulundukları dosyalar ise şunlardır :
DLL Fonksiyonları
Advapi32.dll Şifre ve Kayıt dosyası işlemleri gibi gelişmiş bir çok API'ler
Comdlg32.dll Diyalog pencereleri ile ilgili API'ler
Gdi32.dll Grafik API'leri
Kernel32.dll Çekirdek Windows API'leri
Lz32.dll 32 bit skıştırma API'leri
Mpr.dll Multiple Provider Router API'leri
Netapi32.dll 32-bit Network API'leri
Shell32.dll 32-bit Shell API'leri
User32.dll Kullanıcı arabirimi API'leri
Version.dll Versiyon işlemleri API'leri
Winmm.dll Multimedia API'leri
Winspool.drv Print spooler API'leri



API nedir? Örnek Bir Çalışma Yapalım
Konu: Windows API'lerinden birisini kullanarak dial-up bağlantı şifrelerini vs. öğrenmek
Kullanılacak API: mpr.dll (WIN32 Network Interface DLL)
Kullanılacak API Fonksiyon: WnetEnumCachedPasswords
Seviye: İleri düzey
API (application programming interface) nedir ?
Uygulama programlama arabiriminin kısaltması olan API kavramı, kısaca Windows işletim sisteminin temel günlük işlerini Visual Basic altında kullanabilmemizi sağlayan fonksiyonlardır. Yani mesela API'ler sayesinde Windows'un restart (yeniden başlat) yada shutdown (bilgisayarı kapat) fonksiyonlarını kullanabiliriz.
API, programın çalışması esnasında ; Windows işletim sisteminde var olan programlara özgü bilgisayar hizmetlerinin bir kümesi olan DLL dosyalarından oluşur.
Mesela Visual Basic'in aslında varolan UCASE$ fonksiyonunu ele alalım. Bir string'i (karakteri yada cümleyi) büyük harfler ile yazmak için UCASE fonksiyonunu kullanırız.
Örneğin:
DIM RT AS STRING
RT isimli string bir değişkenimiz oldu. Karakter yada cümle vs. atayabiliriz:
RT="Ekrem"
şimdi RT değişkenine Ekrem değerini atadık. Şimdi bu değerin tüm harflerini büyük harfe çevirmek için:
RT = UCASE$(RT)
yazmamız yeterli.
Bu örnekte gördüğünüz gibi, Visual Basic'in aslında varolan ucase komutunun bir kullanım şekli vardır. Ve bu kullanım şeklini bilmemiz durumunda istediğimiz her komutu kullanabilmekteyiz. Ama Windows'un bir API'sini yani bir fonksiyonu kullanmak için tanımlamamız gerekmektedir.
Örneğin:
Bu komut kümesi sayesinde, ses kartının var olup olmadığını öğrenebiliriz.
Declare Function waveOutGetNumDevs Lib "winmm.dll" () As Long
Bu satır ile winmm.dll kütüphanesi içerisindeki waveoutgetnumdevs isimli komutu/fonksiyonu tanımlıyoruz. Böylece sanki Visual Basic'e yeni bir komut/fonksiyon kazandırmış oluyoruz.
Function HasSound() As Boolean
Dim rtn As Long
rtn = waveOutGetNumDevs() 'ses kartı var mı diye kontrol et.
HasSound = rtn > 0
End Function
Ve sonra HasSound isminde bir fonksiyon ile bu API'yi kullanıyoruz.
Hassound TRUE değerini verirse, ses kartı mevcut. False değerini verirse ses kartının mevcut olmadığı anlamına geliyor.
İşte sizinde gördüğünüz gibi Visual Basic'in aslında varolan UCASE fonksiyonunu şu şekilde tanımlamamıza gerek yoktur : Declare Function Ucase (X As String) As String
Çünkü Ucase fonksiyonu zaten Visual Basic'te tanımlanmış hazır bir fonksiyondur. Ama API ; var olan ve bir dll (dynamic link libraries) dosyasında saklı olan bir komuttur/fonksiyondur. Bu sebeple tanımlamamız gerekmektedir.
Bir örnek daha vererek API konusunu pekiştirelim:
Tanımlamalar
Private Const EWX_REBOOT As Long = 2
Private Declare Function ExitWindowsEx Lib "user32" (ByVal dwOptions As Long, ByVal dwReserved As Long) As Long
Bu API sayesinde Windows'u yeniden başlatabiliriz (reboot)
lngResult = ExitWindowsEx(EWX_REBOOT, 0&)
Yukarıdaki bu son örnekte de gördüğünüz gibi user32.dll dosyasında mevcut olan ExitWindowsEx isimli fonksiyonu önce tanımladık. Nasıl kullanılacağını, gerekli parametreleri gördük ve uygulamasını da yaptık. Burada lngResult değişkeni Long bir değişkendir. Neden? Çünkü API tanımlamasından da anlayacağınız üzere API'nin tanımının en sonunda As Long yazıyor.
Peki diyeceksiniz ki ben bu fonksiyonları nerden bulacağım ve bu tanımlamaları nasıl yapacağım ? Evet bu sorunun cevabı : Microsoft Visual Basic'in API Viewer eklentisi.
Visual Basic'i kurduğunuz zaman beraberinde API Viewer isimli uygulamada kurulur, yada kurulmadıysa Visual Basic'in Setup'ından bunu kurmalısınız.

Resmi orjinal boyutlarında görmek için tıklayın.
Programın kullanımı gayet kolaydır. Öncelikle File menüsünden Load Text File seçeneğini kullanıp, Visual Basic'in yüklü olduğu klasörün bir alt klasörü olan Tools klasöründen WIN32API.TXT dosyasını yükleyelim. Şimdi API types bölümünden mesela Declares'i seçelim. Karşımıza declares (tanımlama) listesi çıkacaktır.

Resmi orjinal boyutlarında görmek için tıklayın.
Bu listeden seçtiğimiz bir fonksiyon/komut üzerine çift tıklayarak tanımlamasını Selected Items bölümünde görebiliriz. Bu bölümü temizlemek için yada bu bölümdeki bilgiyi kopyalamak için vs. sağ taraftaki tuşları kullanabiliriz. Mesela bu listeden ExitWindowsEx isimli fonksiyonu seçin. Aşağıdaki bölgede tanımlaması olarak şu belirecektir :
Public Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Görüyorsunuz ki fonksiyonun tanımlaması içerisinde bazı değişkenler geçmektedir. Bizim bu değişkenleri de tanımlamamız gerekiyor. Yani dwReserved ve uFlags değişkenlerini.
Uflags değişkeni : ewx_force , ewx_logoff, ewx_poweroff, ewx_reboot, ewx_shutdown değerlerinden birini almalıdır. Bu durumda bizim bu sabitleri de tanımlamamız gerekmektedir. İşte şimdi API Viewer programından API Type yazan yeri Constants yapalım ve bu defa çıkan listeden ewx_force , ewx_logoff, ewx_poweroff, ewx_reboot, ewx_shutdown değişkenlerini arayalım ve bulup tanımlamaları kopyalayalım:
uFlags
bu değişkenlerin birisi (veya fazlası) bilgisayarı nasıl kapayacağını ne yapacağını gösterir.
EWX_FORCE = 4
Uygulamaları hemen soru sormadan kapanmaya zorlar.
EWX_LOGOFF = 0
Ağdan ayrılmanızı sağlar.
EWX_POWEROFF = 8
Sistemi kapatır ve mümkünse bilgisayarı da kapatır.
EWX_REBOOT = 2
Sistemi yeniden başlatır
EWX_SHUTDOWN = 1
Sistemi kapatır.
dwReserved
Değeri daima 0 (sıfır) 'dır.
(Örnek : Const EWX_REBOOT As Long = 2)
Şimdi bu tanımlamalardan sonra, Windows'u yeniden başlatan kodu yazalım :
Dim retval As Long
retval = ExitWindowsEx(EWX_REBOOT Or EWX_FORCE, 0)
buradaki retval değeri fonksiyonun çalışıp çalışmadığını denetlemek içindir. Eğer fonksiyon çalışmazsa 0 (sıfır) değerini alır. Yani bu satırın altına şunu yazabiliriz:
If retval = 0 Then MsgBox "Reboot yapamadı"
EWX_REBOOT OR EWX_FORCE satırı sayesinde açık olan tüm uygulamaları kapanmaya zorlayıp, reboot yapıyoruz. Eğer EWX_FORCE satırını yazmazsak açık olan uygulamaları kapanmaya zorlamadan reboot olayı gerçekleşir ki bu bilgi kaybına sebep olabilir.
Apilerin kullanımları API Viewer sayesinde bulabileceğiniz gibi,
[url=http://www.vbapi.com/ref/index.html]http://www.vbapi.com/ref/index.html[/url] adresinden de bulabilirsiniz.

Bu kısa API açıklamasından sonra gelelim bir başka API'nin kullanımına: mpr.dll dosyası içerisindeki WnetEnumCachedPasswords isimli bir fonksiyon ile Internet'e bağlantı şifrelerini vs. öğrenebiliriz. Şimdi bu API'nin kullanımı anlatalım.
Öncelikle API'nin declare bölümünü halledelim.
Declare Function WNetEnumCachedPasswords Lib "mpr.dll" (ByVal cString As String, ByVal nLoop As Integer, ByVal bByte As Byte, ByVal proc As Long, ByVal lLong As Long) As Long
Programı yazmak için ben 1 form ve 1 module kullandım.
Formda 1 tane listbox var. List1 isimli (Form : .frm uzantılı dosyadır)
Modülde 1 tane fonksiyon ve 1 tane sub kullandım. (Module : .bas uzantılı dosyadır)
Bu fonksiyona callback ismini verdim ve fonksiyona X ve lsomething değeri girilince integer değer veriyor. X için yeni bir tür oluşturdum ve türün ismini password_cache_entry koydum. Şimdi bir de bunu tanımlayalım:
Type PASSWORD_CACHE_ENTRY
cbEntry As Integer
cbResource As Integer
cbPassword As Integer
iEntry As Byte
nType As Byte
abResource(1 To 1024) As Byte
End Type
Bu sayede elde edeceğimiz X değeri hem Entry (bir şifre yerini) hem kaynağı hem o kaynağa ait şifreyi hem türünü sayısını (kaç tane şifre var) vs. içerecek ve bu X değerini callback fonksiyonu ile parçalayacağız. Yani ayrıştıracağız. Örneğin X değerinin ekrem1567hasan23838ahmet37733 olduğunu düşünürsek biz bu değeri ekrem=1567, hasan=23838, ahmet=37733 şeklinde ayrıştıracağız ve bunları form üzerinde göstereceğiz.
Public Function callback(X As PASSWORD_CACHE_ENTRY, ByVal lSomething As Long) As Integer
Dim nLoop As Integer
Dim cString As String
Dim ccomputer
Dim Resource As String
Dim ResType As String
Dim Password As String
ResType = X.nType
For nLoop = 1 To X.cbResource '1 den X.cbResource'a kadar yani kaç tane şifre varsa o kadar loop yapacak. Böylece şifre kaynaklarını öğreneceğiz. Mesela dial-up networking (çevirmeli ağ'da) Superonline isimli bir bağlantınız var. Ixir isimli bir başka bağlantınız var. Yani toplam 2 bağlantınız varsa, X.cbResource sayısı 2dir. 1'den 2'ye kadar bir döngü oluşturmuş oluruz. Bu döngü sayesinde Cstring değerini öğreneceğiz. Cstring çevirmeli ağ'da görünen isimdir. Yani mesela yukarıdaki dediğimiz durum sizde mevcut ise, 1. cstring değeri Superonline/username. 2.cstring değeri Ixir/username olacaktır. Yani bağlantı yeriniz ve kullanıcı adınız. Bir sonraki adımda şifreyi öğreneceğiz.
If X.abResource(nLoop) <> 0 Then
cString = cString & Chr(X.abResource(nLoop))
Else
cString = cString & " "
End If
Next
Resource = cString 'Resource değişkenine cString'in değerini aktarıyoruz.
cString = "" 'cstring değişkenini sıfırlıyoruz

'Şimdi tekrar bir döngü kuruyoruz. Bu döngü ile de her bir resource'a denk gelen şifreyi öğreniyoruz.
For nLoop = X.cbResource + 1 To (X.cbResource + X.cbPassword)
If X.abResource(nLoop) <> 0 Then
cString = cString & Chr(X.abResource(nLoop))
Else
cString = cString & " "
End If
Next
Password = cString 'burada her bir resource'a denk gelen şifreyi elde ediyoruz.

cString = ""
'bazen browser(tarayıcımız) ile sitelerde gezerken bize kullanıcı adı ve şifre sorar. Mesela fortunecity'den bir web alanı aldınız ve dosya yüklemek istiyorsunuz. Bir diyalog çıkar ve kullanıcı adı & şifre ister. Bu diyaloğun altında da bir soru vardır. Şifreyi kaydedeyim mi diye. İşte eğer bu kutuyu da işaretlemişseniz, burada kaydettiğiniz şifreleri de bu şimdi yazdığımız program ile göreceksiniz. Ama bu program ile gö(ste)rmek istemiyorsanız şu satırı buraya eklemeniz yeterli olacaktır.
If X.nType <> 6 Then GoTo 66 'tür 6 dan farklı ise 66.satıra git. Tür'ün 6 olması demek dial-up (çevirmeli ağ) şifresi olması demek.
' bu yukardaki satır sayesinde türü 6'dan farklı olan şifreler formdaki listbox'imiza eklenmiyecek ve atlanacaktır.

If UCase$(Left$(Resource, 5)) = "*RNA\" Then
Resource = Right$(Resource, Len(Resource) - 5)
'Dial-up şifrelerin resource'u *RNA\ ile başlar. Mesela *RNA\Superonline\ekremdeniz .İşte formumuzda yani programı çalıştırdıktan sonra böyle bir görünüm olmaması için başında *RNA\ olan resourceların baş kısmındaki bu fazlalığı bu if-endif sayesinde yok ediyoruz.
End If
Form1.list1.AddItem Resource & " -------- " & Password 'form1'deki list1 isimli listbox'a resource ve şifre eklenecektir. Örneğin Superonline/ekremdeniz ---- 348d3j gibi böylece programın bulduğu kullanıcı adı ve şifre programda listbox içinde altalta eklenecektir.
66
'burası 66.satırın devamıdır. Satır başına 66 yazmamız orayı 66.satır diye adlandırmamıza neden olur.
callback = True
'callback değeri TRUE atanmadan önce 0'dır. TRUE atandıktan sonra -1 değerini alır
End Function
Böylece fonksiyonumuzu hazırladık. Bu fonksiyonda gördüğünüz gibi, hiç tanımladığımız API ile ilgili birşey yoktu. Neden ? Çünkü fonksiyonu Sub içerisinden çağıracağız. (Yukarıda demiştim : 1 fonksiyon 1 sub hazırladım diye)
Gelelim bu Sub 'i yazmaya:
Public Sub GetPasswords()
'Önce WnetEnumCachedPasswords APIsi için gerekli olan parametreleri tanımlayalım ve birer öncelikli değerler atıyalım.(sıfırlayalım)
Dim nLoop As Integer
Dim cString As String
Dim lLong As Long
Dim bByte As Byte
bByte = &HFF
nLoop = 0
lLong = 0
cString = ""
'Gördüğünüz gibi bu sub içerisinde API'yi kullanıyoruz ve API de callback fonksiyonunu bir parametresi olarak kullanıyor.
Call WNetEnumCachedPasswords(cString, nLoop, bByte, AddressOf callback, lLong)
End Sub

Şimdi fonksiyonumuzu yazdık. Sub'imizi yazdık. Sub çağrılınca fonksiyonda devreye girecek. Çünkü fonksiyon Sub'daki API komutunun bir parametresi olarak kullanıldı. Bu foksiyon ve sub ve declare'lari (yukardaki tanımlamaları) bir module dosyasına kaydedelim. Örneğin module1.bas dosyası. Ve artık yapmamız gereken tek şey: Form'dan getpasswords isimli sub'i çağırmak.
Form'un load bölümüne (form_load)
Call Getpasswords
Yazmamız yeterli olacaktir.

Resmi orjinal boyutlarında görmek için tıklayın.

Artık programı çalıştırın ve unuttuğunuz şifreleri rahatlıkla hatırlayın... :-)
Şimdi bu anlattığımız konuda geçen olaylardan bazılarını tekrar gözden geçirelim ve yazımızı sonlandıralım.
1- programda 1 form ve 1 module kullandık. Module kullanmamızın sebebi, public olarak tanımladığımız tüm API ve fonksiyonları programımızın tüm formlarında kullanabilmektir. Yani mesela 2 formdan oluşan bir program düşünün ve birinci formda bir fonksiyon tanımladığımızı düşünün. Şimdi o fonksiyonu 2.formda nasıl kullanacağız ? Fonksiyon eğer module'de tanımlanırsa tüm formlarda kullanılabilinir.
2- Bu program ile form'a yerleştirdiğimiz listbox'in her satırında yeni bir şifreyi görmemizi sağladık. Bunu yapmak için
Form1.list1.AddItem Resource & " -------- " & Password
kalıbını kullandık yani name'i (adı) Form1 olan formumuzda mevcut olan, ve adı list1 olan listbox'imizin her satirina resource ----- password şeklinde kullanıcı adı ve şifreleri eklettik. Ve şöyle bir görünüm elde ettik :
Superonline/ekremdeniz ------ sifre
Ixir/kullaniciadi ------ sifre
Turk.Net/kullanici ------ sifre
ISS/kullaniciadi ------ sifre
3- Ama şunu unutmamalısınız, Çevirmeli Ağ'dan bir bağlantınızı çevirirken yani internete bağlanırken, size kullanıcı adı ve şifrenizi yazmanızı isteyen bir diyalog görünür. Bu diyalog'da Save Password (Parolayı Kaydet) kutucuğu işaretli değilse, yani her seferinde siz şifrenizi yazıyorsanız, bu program işe yaramayacaktır. Çünkü programın özelliği, kaydedilmis ve ****** şeklinde görünen bağlantı şifrelerini ve diğer şifreleri göstermektir.
(Örnek yapılmış programı (sifrele.exe) çalıştırabilmek için VB6 Runtime Files yüklü olmalıdır.)

CD-ROM Kapağı kontrolu
Merhaba arkadaşlar altta yazmış olduğum komutlarla basit bir api kullanımı göreceğiz.Kullanmış olduğumuz cd-rom'umuzun kapağını açmayı ve kapatmayı deneyeceğiz.

Visual basic üst menüsünden Add-Ins bölümünden Add-In Manager... seçerek "VB 6 API Viewer" Loaded edilir.

Daha sonra formumuzun üzerine iki adet command ekleriz.
Caption özelliği ile birine "Aç" diğerine "Kapat" yazarız.

Api viewer'ı açarak File'dan Load text file seçilir.
Karşımıza gelen pencerede "Win32api.txt" seçilerek aç denir.

Available items bölümünden "mciexecute" seçilir ve

Declare scope bölümünde "private" seçilir ardından Add tuşu tıklanır.

Alt kısımdaki pencereye komut satırının geldiğini göreceksiniz.Burada copy tuşuna basar ve Api viewer'ı kapatırız.

Formumuzun general bölümüne yapıştır deriz bu bölüme gelecek olan satır şudur:

Private Declare Function mciExecute Lib "winmm.dll" Alias "mciExecute" (ByVal lpstrCommand As String) As Long

Daha sonra command1_click kısmına (Aç butonu)

mciexecute("set cdaudio door open")

command2_click kımına (Kapat butonu)

mciexecute("set cdaudio door closed")

yazarak programımızı bitiririz.

Not:Programı çalıştırdığınızda çalışmaz veya hata verirse general kısmındaki komutun private ile başlayıp başlamadığına dikkat edin.(Private ile başlamalı)

06.02.2007 - Hamdi

Konular

Hanci.org sizlere daha iyi hizmet sunmak için çerezleri kullanıyor.
Hanci.org sitesini kullanarak çerez politikamızı kabul etmiş olacaksınız.
Detaylı bilgi almak için Gizlilik ve Çerez Politikası metnimizi inceleyebilirsiniz.