gokhan_rs
New member
- Katılım
- 31 Ocak 2008
- Mesajlar
- 58
- Reaction score
- 0
- Puanları
- 0
Ö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.
Uzun uzun araştırdıktan sonra yabancı bir sitede buldum bu yöntemi, olabildiğince anlatımını yapma çalıştım :hhman:
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.
Uzun uzun araştırdıktan sonra yabancı bir sitede buldum bu yöntemi, olabildiğince anlatımını yapma çalıştım :hhman: