Hızlı Konu Açma

Hızlı Konu Açmak için tıklayınız.

Son Mesajlar

Konulardaki Son Mesajlar

Reklam

Forumda Reklam Vermek İçin Bize Ulaşın

DLL kulanımı

BOMBFACTORY

Uzman Üye
Uzman Üye
Trabzonspor
Katılım
5 Ocak 2014
Mesajlar
3,333
Tepkime puanı
6
Puanları
136
Dll içerisindeki prosedürler ve fonksiyonların kullanımı
DLL içindeki bir yordamın tanımlanması
Windows API dışındaki DLL dosyaları içinden yordam kullanmak veya win32api.txt dosyası içinde yapılmış olan tanımları kendi gereksinimlerimize göre değiştirmek için DLL içindeki bir yordamın nasıl tanımlanabileceğini öğrenmek gerekir.
Bir DLL yordamını tanımlamak için Declare deyimi kullanılır. Eğer yordam bir değer döndürüyorsa Function, döndürmüyorsa Sub olarak tanımlanır. Declare deyiminin kullanışı aşağıdaki biçimdedir.
Declare Function publicname Lib "libname" [Alias "alias"]
[([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type
Declare Sub publicname Lib "libname" [Alias "alias"]
[([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])]
Kütühane İsmi (libname)
Windows kütüphaneleri için (User32, Kernel32 veya GDI32) dosyanın tam adını ve yolunu belirtmeye gerek yoktur. Örneğin;
Declare Function GetTickCount Lib "kernel32" Alias _
"GetTickCount" () As Long
Diğer DLL dosyaları kullanılırken tam yol ve dosya adı verilmek zorundadır
Declare Function Topla Lib "c:\hesap.dll" _
(ByVal sayi1 As Integer, ByVal sayi2 As Integer) As Long
DLL dosyasının yolu verilmezse bu dosya için;
Programın .EXE dosyasının bulunduğu yere,
Aktif dizine,
Windows’un System dizinine,
Windows dizinine,
PATH değişkeninde tanımlı dizinlere
bakar.
Parametre türlerini belirlemeden önce sık kullanılan bazı DLL dosyalarının tanımlarını verelim.
Advapi32.dll Advanced API services library supporting numerous APIs including many security and Registry calls
Comdlg32.dll Common dialog API library
Gdi32.dll Graphics Device Interface API library
Kernel32.dll Core Windows 32-bit base API support
Lz32.dll 32-bit compression routines
Mpr.dll Multiple Provider Router library
Netapi32.dll 32-bit Network API library
Shell32.dll 32-bit Shell API library
User32.dll Library for user interface routines
Version.dll Version library
Winmm.dll Windows multimedia library
Winspool.drv Print spooler interface that contains the print spooler API calls

String kullanan Windows API yordamları
String kullanan Windows API yordamlarını kullanmak için karakter kümesini belirtmek gerekir. Bu karakter kümesi ANSI veya Unicode olabilir. Windows 95 için kullanılan karakter kümesi ANSI karakter kümesidir. Windows API içinde bu durum için bir yordamın genelde iki tanımı birden olur. Bunlardan biri ANSI kodunu destekler, diğer Unicode kodunu destekler. Yukarıda verilen örnekteki SetWindowsText yordamı için USER32.DLL dosyasında, SetWindowsTestW ve SetWindowsTextA olarak adlandırılmış iki ayrı tanım sözkonusudur. Bu tanımlardan hangisinin kullanılmak istendiği Alias kısmında verilen isim ile belirtilir.
Parametreleri değer ile veya referans ile gönderme
Visual Basic yordamlarında eğer belirtilmemişse parametre geçiş yöntemi referans ile göndermedir. Bunun anlamı parametre olarak verilen değişkenin değeri yerine bellek adresinin gönderilmesidir.
Çoğu DLL yordamı parametrelerinin değerle aktarılmasını öngörürler. Bu tür yordamlara referans ile parametre gönderilirse hatalı bir veri gönderilmiş olur.
Örneğin yukarıda bir formun başlığını değiştiren örnekte ilk parametre olan HWND parametresi tanımı yapılırken referans ile gönderme türünden tanımlanmış olsaydı bu bir hata olurdu. Çünkü bu yordamın DLL kütüphanesi içindeki tanımında bu parametre değer ile gönderilen bir parametredir.
Bir parametreyi değer ile göndermek için ByVal, referans ile göndermek için de ByRef sözcükleri kullanılır.
Herhangi bir DLL kütüphanesinin C dilindeki tanımından yararlanarak bir tanım yapılırken, diziler dışındaki değişkenlerin ByVal olarak gönderildiği dikkate alınmalıdır.
Alias kullanımı
Tanımlanacak bir yordama DLL kütüphanesi içindeki tanımından farklı bir isim verilmek istendiğinde yordamın DLL kütüphanesi içindeki adı Alias kısmında verilir.
Örnek olarak, önce bir proje yaratın ve formun üzerinde bir CommandButton ve bir Label yerleştirin. Daha sonra aşağıdaki kodu ekleyin.
Private Declare Function WindowsDiziniGoster Lib "kernel32" _
Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, _
ByVal nSize As Long) As Long
Private Sub Command1_Click()
Dim n As Integer
Dim str As String
str = Space$(100)
n = WindowsDiziniGoster(str, 100)
Label1.Caption = Left$(str, n)
End Sub

Bu program çalıştırılıp form üzerindeki butona basıldığında bilgisayardaki windows dizini form üzerindeki Label nesnesine yazılır.
Esnek parametre türleri
Bazı DLL kütüphaneleri aynı parametre değişkeni için birden fazla türün kullanılmasına izin verir. Eğer farklı türlerden veriler bu tür yordamlara gönderilecekse parametre tanımları Any türü olarak tanımlanmalıdır.
Buna örnek olarak aşağıdaki tanım verilebilir.
Declare Function MapWindowPoints Lib "user32" Alias _
"MapWindowPoints" (ByVal hwndFrom As Long, _
ByVal hwndTo As Long, lppt As Any, _
ByVal cPoints As Long) As Long
Bu yordam bir nokta dizisinin bir penceredeki konumunu verilen bir başka pencere üzerindeki bir konuma çevirir. Sonuç, yordamın 3. Parametresi içinde döndürülür. Bu parametre POINT türünde veya RECT türünde olabilir. Bu türler sırasıyla 2 ve 4 Long türünde sayı içeren türlerdir.
As Any kullanımı her ne kadar esneklik sağlıyorsa da kullanılırken dikkatli olunmalıdır. Yanlış veri türleriyle kullanılınca ancak çalışma esnasında bu fark edilebilir.
Parametre olarak String gönderme
Genelde string türü değişkenler ByVal olarak gönderilir. Visual Basic içinde string türü BSTR olarak bilinen bir yapıyı belirtir. Bu yapı string uzunluğu ve içeriği hakkında bilgiler tutar. Bu yapı parametre olarak bir yordama gönderildiğinde yordamın bu yapıdaki içerik bilgisini değiştirmesine olanak verilir.
WinAPI yordamlarında genellikle LPSTR olarak adlandırılan C string yapıları kullanılır. Bu parametrelere karşılık olarak Visul Basic içinde kullanılan BSTR verilebilir.
Bu kullanımı yukarıda Windows dizinini almak için kullanılan örnekten görmek mümkündür. Windows dizini ByVal olarak tanımlanmış olan String türündeki bir değişken içinde döndürülmektedir.
Genel olarak LPSTR türü string bekleyen yordamlara String türü değişkenler parametre olarak verilebilir.
Bir DLL yordamına BINARY verilerden oluşan bir karakter dizisi parametre olarak verilecekse, String yerine Byte dizisi gönderilmelidir.
Parametre olarak dizi gönderme
Dizinin herhangi bir elemanını parametre olarak göndermek dizinin türü ile aynı türden olan bir değişkeni göndermekten farksızdır. Ancak bazen tüm diziyi parametre olarak göndermek gerekebilir. Bu durumda dizi tıpkı Visual Basic yordamlarında olduğu gibi boş parantezlerle göderilir.
Sayı içeren bir dizinin ilk parametresini ByRef olarak göndermek, bütün diziyi göndermek anlamına gelir. Bu yaklaşım string dizileri için de geçerlidir. C dilinde string dizileri gösterge içeren diziler olarak algılanır ve Visual Basic ile aynı şekilde kullanılır.
Kullanıcı tarafından tanımlanmış türlerin kullanımı
Bunu örneklemek için aşağıdaki örneği inceleyin.
Private Type RECT
sol As Long
ust As Long
sag As Long
alt As Long
End Type
Private Declare Function RenkleriTersCevir Lib "User32" Alias "InvertRect" _
(ByVal hdc As Long, lpRect As RECT) As Long
Dim rect1 As RECT
Private Sub Form_Load()
ScaleMode = 3
End Sub

Private Sub Form_MouseDown(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If Button And 1 Then
rect1.sol = X
rect1.ust = Y
rect1.sag = X
rect1.alt = Y
End If
End Sub

Private Sub Form_MouseUp(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If Not (Button And 1) Then
rect1.sag = X
rect1.alt = Y
RenkleriTersCevir hdc, rect1
End If
End Sub
Bu program mouse basılı tutularak seçilen bir alandaki renkleri ters çevirir. InvertRect yordamına parametre olarak program içinde tanımlanan RECT türü gönderilmiştir. Burada dikkat edilmesi gereken önemli bir husus gönderilen türün yordamın ihtiyaç duyduğu tür ile aynı yapıda olmasına dikkat edilmelidir.
DLL yordamlarına fonksiyon göstergelerini parametre olarak gönderme
Fonksiyon göstergesi, kullanıcı tarafından tanımlanmış fonksiyonların adreslerini belirtir. Bu göstergeler, bir DLL yordamı kullanıcı tarafından tanımlanmış bir yordamı kullanacağı zaman kullanılır. Fonksiyon göstergelerini kullanmak için Address of fonksiyon_adı deyimi kullanılır.
Diğer türlerin parametre olarak gönderilmesi
String türü bir değişkene boş gösterge göndermek gerektiğinde vbNullString sabiti kullanılır.
Örneğin FindWindow yordamı belli bir pencereyi başlığı sayesinde bulur ve bu pencereye bir gösterge döndürür.
Declare Function FindWindow Lib "user32" Alias _
"FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Bu yordamın kullanılışı aşağıdaki gibi olabilir.
hWndExcel = FindWindow(vbNullString, "Microsoft Excel")
Bu yordamda ilk parametre boş bir string olarak gönderilmektedir.
Nesne özellikleri de yordamlara parametre olarak gönderilebilir. Özellikler parametre olarak gönderilirken ByVal olarak gönderilmelidir. ByRef olarak kullanmak için ara bir değişkene ihtiyaç duyulur.
Nesne göstergelerini parametre olarak göndermek mümkündür. Örneğin bir formun hWnd ve hDC göstergelerini bir yordama parametre olarak göndermek mümkündür.
Variant türündeki bir değişkeni Variant olmayan bir değişkenin yerini tutması için göndermek gerektiğinde ByVal olarak gönderilir.
C tanımlarını Visual Basic tanımlarına dönüştürme
DLL dosyaları içindeki yordamlara ait dokümanlar genelde C diline uyumlu olarak yazılmıştır. Bunları Visual Basic içinde kullanabilmek için tanımları çevirmek gerekir. Bu çevirinin bir parçası da C dilindeki türler için uygun Visual Basic veri türlerini kullanmak ve parametre geçiş yöntemini belirlemektir.
Bu çeviri işlemi için aşağıdaki tablo kullanılabilir.
C veri türü Visual Basic içinde tanımıNe tür değerlerle çağrılabileceği
ATOM ByVal variable As Integer Integer
BOOL ByVal variableAs Long Long
BYTE ByVal variable As Byte Byte
CHAR ByVal variable As Byte Byte
COLORREF ByVal variable As Long Long
DWORD ByVal variable As Long Long
HWND, HDC, HMENU, etc. (Windows handles) ByVal variable As Long Long
INT, UINT ByVal variable As Long Long
LONG ByVal variable As Long Long
LPARAM ByVal variable As Long Long
LPDWORD variable As Long Long
LPINT, LPUINT variable As Long Long
LPRECT variable As type Kullanıcı tarafından tanımlanmış herhangi bir tür
LPSTR, LPCSTR ByVal variable As String String
LPVOID variable As Any Herhangi bir değişken (string türü için ByVal)
LPWORD variable As Integer Integer
LRESULT ByVal variable As Long Long
NULL As Any or ByVal Nothing, ByVal 0 & ByVal variable As Long vbNullString
SHORT ByVal variable As Integer Integer
VOID Sub procedure Desteklenmez
WORD ByVal variable As Integer Integer
WPARAM ByVal variable As Long Long

Örnek: Windows’u kapatan program.
Bu örnek için yeni bir proje yaratın ve içindeki formu silip yerine bir module ekleyin. Bu modülün içine aşağıdaki kodu ekleyin.
Option Explicit
Private Declare Function WindowsKapat Lib "user32" Alias _
"ExitWindowsEx" (ByVal uFlags As Long, ByVal dwRes As Long) As Long
Private Sub Main()
If MsgBox("Windows'u kapatmak " & vbCrLf & "istiyor musunuz", _
vbYesNo, "Windows Kapaniyor") = vbYes Then WindowsKapat &H41, 0
End Sub
Bu programı çalıştırmadan önce projeyi kaydedin. Daha sonra File menüsünden proje için bir .EXE dosyası oluşturun. Bu program çalıştırıldığında Windows kapanır.
Burada uFlags parametresi için gönderilen değer, tüm programların kapatılıp windows’un kapatılması anlamına gelmektedir.
 

Users Who Are Viewing This Konu (Users: 0, Guests: 1)

Üst