Favorilerine Ekle | Giriş Sayfan Yap | Tavsiye Et

 

Kurs Tanıtım Sayfası | Süper Üye Kimdir? | Menü Tasarımı Konulu Örnek Ders
Kod İndir| Hazır Kodlar | Makaleler| İpuçları | VB .NET Kursu | Dersler | Forum | Alt Bölümler | Servisler
    Merhaba Misafir
    anasayfa » visual basic makaleleri » Visual Basic 6 ile API oluşturalım!
Üye Girişi
Kullanıcı Adı:  
Şifre : 
Kaydet ?
Siteden tam olarak faydalanabilmek için üye olmalısınız.
Unuttuğunuz şifrenizi öğrenebilmek için kayıt sırasında verdiğiniz Hatırlatma Cevabı'nı bilmeniz gereklidir.
Şifre hatırlatma işlevini sadece 3 defa kullanma hakkınız vardır.
Kullanıcı adını ve şifresini unutan üyelere email ile yardım verilmez.

Aktivasyon Gelmedi mi?Aktivasyon mesajınız email adresinize gelmedi mi?
Buraya tıklayarak bir kez daha aktivasyon mesajı gönderilmesini sağlayabilirsiniz.
Lütfen email hesabınızın BULK ve SPAM klasörlerini de kontrol ediniz.
Rastgele Makale

İki listeden aynı sayıları çıkaran program

Yazar: spider58

Webmasterlar
Sitenize Ekleyin!
Sitenizde "Son Eklenen 10 Visual Basic Yazısı"'nı göstermek ve içeriğini zenginleştirmek için buraya tıklayınız.

Vbasicmaster.com'a link verin!
Aşağıdaki minik banneri sitenize eklemek için tıklayın!

Çevrimiçi Üyeler
halilyaman85

Üye Sayısı:
Ziyaretçiler nerede?
Yayın № : 9894
Yayın Tar:03.02.2008
Yazar : gokhan.bg
Hit :4307

Bu Yazarın Yazıları Sadece bu yazarın makale göster
Bu Yazıyı Tavsiye Et

Öncelikle şunu belirteyim visual basic dll ile api yapmaya imkan sağlamıyor ama bunu ufak bir değişiklik ile halledeceğiz.
1. C:\Program Files\Microsoft Visual Studio\VB98\ bu dizine giriyoruz (ya da Visual Basic nereye kuruluysa oraya) ve LINK.EXE dosyasının yedeğini alıyoruz.
2. Aşağıdaki kodları LINK.EXE olarak derliyoruz ve yukarıda belirttiğim dizine atıyoruz.

'Link.exe kodları
Option Explicit

Public Sub Main()

Dim SpecialLink As Boolean, fCPL As Boolean, fResource As Boolean
Dim intPos As Integer
Dim strCmd As String
Dim strPath As String
Dim strFileContents As String
Dim strDefFile As String, strResFile As String
Dim oFS As New Scripting.FileSystemObject
Dim fld As Folder
Dim fil As File
Dim ts As TextStream, tsDef As TextStream

strCmd = Command

Set ts = oFS.CreateTextFile(App.Path & "\lnklog.txt")

ts.WriteLine "Beginning execution at " & Date & " " & Time()
ts.WriteBlankLines 1
ts.WriteLine "Command line arguments to LINK call:"
ts.WriteBlankLines 1
ts.WriteLine " " & strCmd
ts.WriteBlankLines 2

' Determine if .DEF file exists
'
' Extract path from first .obj argument
intPos = InStr(1, strCmd, ".OBJ", vbTextCompare)
strPath = Mid(strCmd, 2, intPos + 2)
intPos = InStrRev(strPath, "\")
strPath = Left(strPath, intPos - 1)
' Open folder
Set fld = oFS.GetFolder(strPath)

' Get files in folder
For Each fil In fld.Files
If UCase(oFS.GetExtensionName(fil)) = "DEF" Then
strDefFile = fil
SpecialLink = True
End If
If UCase(oFS.GetExtensionName(fil)) = "RES" Then
strResFile = fil
fResource = True
End If
If SpecialLink And fResource Then Exit For
Next

' Change command line arguments if flag set
If SpecialLink Then
' Determine contents of .DEF file
Set tsDef = oFS.OpenTextFile(strDefFile)
strFileContents = tsDef.ReadAll
If InStr(1, strFileContents, "CplApplet", vbTextCompare) > 0 Then
fCPL = True
End If

' Add module definition before /DLL switch
intPos = InStr(1, strCmd, "/DLL", vbTextCompare)
If intPos > 0 Then
strCmd = Left(strCmd, intPos - 1) & _
" /DEF:" & Chr(34) & strDefFile & Chr(34) & " " & _
Mid(strCmd, intPos)
End If
' Include .RES file if one exists
If fResource Then
intPos = InStr(1, strCmd, "/ENTRY", vbTextCompare)
strCmd = Left(strCmd, intPos - 1) & Chr(34) & strResFile & _
Chr(34) & " " & Mid(strCmd, intPos)
End If

' If Control Panel applet, change "DLL" extension to "CPL"
If fCPL Then
strCmd = Replace(strCmd, ".dll", ".cpl", 1, , vbTextCompare)
End If

' Write linker options to output file
ts.WriteLine "Command line arguments after modification:"
ts.WriteBlankLines 1
ts.WriteLine " " & strCmd
ts.WriteBlankLines 2
End If

ts.WriteLine "Calling LINK.EXE linker"
Shell "VBLINK.exe " & strCmd
If Err.Number <> 0 Then
ts.WriteLine "Error in calling linker..."
Err.Clear
End If

ts.WriteBlankLines 1
ts.WriteLine "Returned from linker call"
ts.Close
End Sub
'Programı compile etmeden önce project properties kısmından start-up object kısmını sub main yapıyoruz!
'Link.exe buraya kadar


3. Artık gerekli tüm değişiklikleri yaptık, sıra DLL API dosyamızı nasıl oluşturacağız ona geldi.
Yeni bir proje açıyoruz ActiveX DLL olması önemlidir!
Projemize normal module ekliyoruz class module boş olsun burada bizim için bir işlevi yok.
4. Örnek kod (Module içine yapıştırın)

'Module başlangıç
Option Explicit

Public Const DLL_PROCESS_DETACH = 0
Public Const DLL_PROCESS_ATTACH = 1
Public Const DLL_THREAD_ATTACH = 2
Public Const DLL_THREAD_DETACH = 3

Public Function DllMain(hInst As Long, fdwReason As Long, lpvReserved As Long) As Boolean
Select Case fdwReason
Case DLL_PROCESS_DETACH
' No per-process cleanup needed
Case DLL_PROCESS_ATTACH
DllMain = True
Case DLL_THREAD_ATTACH
' No per-thread initialization needed
Case DLL_THREAD_DETACH
' No per-thread cleanup needed
End Select
End Function

'ÖNEMLİ!!
'Buraya kadar olan kısım tüm dll dosyalarında olmalı!
'Bundan sonraki kısım DLL içindeki fonksiyonları (API'leri) belirtir.

Public Function Topla(var As Integer) As Integer
If Not IsNumeric(var) Then Err.Raise 5
Topla = var + 1
End Function
'Module bitti

5. Şimdi LINK.EXE dosyasını da eğer doğu şekilde derleyip kopyaladıysanız. Projeyi KAYDEDİYORUZ. Projenin kayıtlı olduğu klasöre giriyoruz ve bir dosya oluşturuyoruz adı da project1.def veya dll.def ya da xxx.def olsun ama önemli kısım uzantısıdır yani .def olan kısmıdır. Uzantısı .def olsunda :)
6. Şimdi bu dosyayı açtık dosyayı ne yapıyoruz?
Bu dosyayı not defteri ile açıyoruz içine de:


NAME MathLib
LIBRARY MathMod
DESCRIPTION "Burasi aciklama kismi"
EXPORTS DllMain @1
Topla @2


Bunu aynen yapıştırıyoruz. Hemen ona da bir açıklama getireyim. Bizi ilgilendiren bu dosya da exports bölümüdür!
@1 @2 bunlarda apinin sırasını belirtir. Yani bu kısma az önce module içine koyduğumuz function isimlerini yazıyoruz bunlar API olacak.
Evet dosyayı da kaydettikten sonra, herşey hazırsa projemizi açıyoruz ve derliyoruz.
7. Programlarımız da kullanırken de şöyle tanımlıyoruz:
Private Declare Function Topla Lib "BizimDLL" Alias "Topla" (var As integer) As integer
Dikkat edelim eğer api sub ise declare sub function ise declare function yazalım, değişkenleri değerleri doğru yazalım byte ise byte integer ise integer yazalım bunlar önemlidir yoksa garip hatalar alabilirsiniz. Bir diğer önemli kısım ise oluşturduğumuz dll dosyası ya kullandığımız program ile aynı dizinde olsun ya da system32 veya windows gibi klasörlerde olsun ki yeri bilinsin.
8. Uzun uzun araştırdıktan sonra bunları buldum elimden geldiği kadar anlatmaya çalıştım takıldığınız kısımlar olursa forumları kullanalım, kullanmaya teşvik edelim ki herkes faydalansın.
9. Bir ipucu da benden:
DLL dosyamızı Dependency Walker ile açtığımızda DllCanUnloadNow, DllRegisterServer gibi diğer apilerde çıkıyor bunları iptal edip dosyanın kayıt edilebilir dll olmasını önlemenin yolu winhex ile açıp bu apileri bulup (bulmak kolaydır ve genelde dosya sonlarına yakın yerlerdedir) 00 ile replace etmektir.




Yorumlar, eklemeler ve düşünceler
        güzel çalışma

   erosnovas, 16.02.2008 10:24
© Hakan Ersöz 2000-2013| Üyelik Sözleşmesi | | Ödeme Bildirimi
Sitemizden yenilikleri hemen öğrenin, pop upları engelleyin, chat yapın... ToolBarımızı indirin:
Vasicmaster Toolbar'ı indirin