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

Api Nedir? yorumları

  • Image Description
    Hamdi
    06.02.2007

    İş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ı)

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.