5. DLL (DYNAMIC LINK LIBRARY – DEVİNGEN BAĞLI KÜTÜPHANE) KULLANIMI

Visual Basic tarafından sağlanmayan bazı temel özellikleri kullanmak için DLL kütüphanelerinde saklanan yordamları doğrudan çağırmak mümkündür. Bu yöntem sayesinde Microsoft Windows işletim sisteminin belkemiği olan birçok yordamı ve hatta başka dillerde yazılmış başka kütüphanelere erişmek ve bu yordamları Visual Basic kodu içinde kullanmak mümkündür.

Adından da anlaşıldığı üzere DLL dosyaları birer kütüphanedir. Bu sebeple başka uygulamalar tarafından da kullanılabilirler ve üzerine yapılan eklemelerden programların çalışması etkilenmez. Microsoft Windows işletim sisteminin kendisi de DLL dosyalarından yararlanır ve başka uygulamalar da bu DLL dosyalarını kullanarak grafiksel işlemleri, bellek yönetimini ve daha bir çok değişik işlemi kolayca destekler. Sağlanan bu olanaklara Windows API (Application programming interface- Uygulama programlama arabirimi) denir.

DLL kullanımından başka Visual Basic programları içinde kullanılabilecek bir özellik de Otomasyon(Automation) olarak adlandırılan ve bir uygulamanın nesnelerini dışarıdan (başka bir programın içinden) kullanabilme olanağını sağlayan mekanizmadır. Bu DLL kullanımından daha basittir ve hatalı durumlara düşme riski daha azdır.

Bir DLL yordamını uygulamanın içinde kullanmak

DLL yordamları programın dışında olan öğeler olduğu için bunların program içinde kullanılabilmesi için, içinde bulundukları dosyanın ve yordam parametrelerinin program içinde tanımlanmaları şarttır. Bu işlem bir Declare komutu sayesinde yapılır. Herhangi bir DLL içinde bulunan bir yordam Declare komutu ile tanımlandıktan sonra programnı içindeki diğer yordamlar gibi kullanılabilir.

DLL kullanırken dikkat edilmesi gereken en önemli nokta, hatalı durumlara düşme riskinin büyük olduğudur. Bu sebeple parametrelerine ve veri türlerine dikkat etmek gerekir.

DLL kullanımına basit bir örnek olarak, USER32.DLL dosyasında bulunan ve bir pencerenin başlığını (Caption) değiştiren SetWindowText yordamının kullanılışını örnekleyelim. Bunun için önce aşağıdaki Declare deyimi kullanılarak yordam tanımlanmalıdır.

Bu örnek için yeni bir proje başlatın, formun üzerine bir CommandButton yerleştirin ve aşağıdaki kodu yazın.

Private Declare Function SetWindowText Lib "user32" _

Alias "SetWindowTextA" (ByVal hwnd As Long, _

ByVal baslik As String) As Long

Private Sub Command1_Click()

SetWindowText Form1.hwnd, "Degismis Baslik"

End Sub

Burada önce kullanılacak yordamın tanımı yapılmıştır. Tanım yapılırken parametrelerin türüne dikkat edilmesi gerekir. Bu yordama yeni pencere başlığı ikinci parametre ile gönderilmektedir. Tanımlanan bu yordamın kullanılışı tıpkı normal bir Visual Basic yordamının kullanılışına benzemektedir.

Microsoft Windows işletim sisteminin sağladığı yordamların ve sabitlerin tanımları Visual Basic ile birlikte gelen API text Viewer programı ile görülebilir. Bu program sayesinde tanımlar Visual Basic programlarının içine kopyalanabilir.

Bu programın yukarıda tanımlanan yordamın tanımını kopyalarken durumu aşağıdaki gibidir.
 
 



Bu program kullanılarak Visual Basic ile birlikte gelen;


Dosyaları içinde yer alan DLL yordamlarının tanımlarını programın içine kopyalamak mümkündür.

Microsoft Windows API yordamlarına erişim

DLL dosyalarından programlar içinde en sık ihtiyaç duyulanları ve kullanılanları Windows API olarak bilinen, Windows işletim sisteminin sağladığı fonksiyon ve yordamları içeren DLL dosyalarıdır.

Windows API binlerce yordam, tür tanımı ve sabit tanımlarını içerir. Bu yordamlar C dilinde yazılmıştır, bu yüzden Visual Basic içinde kullanılırken dikkatli bir biçimde yeniden tanımlanmaları gerekir. Visual basic bu işlem için yukarıda da bahsedildiği gibi API Text Viewer programını ve bu tanımların Visual Basic için yapılmış halini içeren bir metin dosyasını kullanıcılara sunmaktadır.

API Text Viewer programı metin kütüklerini, daha hızlı erişim ve kolay aramayı sağlamak için Jet Veritabanlarına çevirebilme özelliğine de sahiptir.

Görüldüğü üzere Windows API yordamlarının tanımlanmasında herhangi bir sorun yoktur. Çünkü zaten hazır tanımları bulunmaktadır ve tek yapılması gereken bu tanımları Visual Basic kodunun içine almaktır.

Windows API dışındaki bir DLL dosyasından yordamlar kullanılacağı zaman uygun tanımı yapmak çok önemlidir. Aksi takdirde istenmeyen durumlar oluşabilir.

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;

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

Ö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.

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.
 
 

back_sel.gif (1050 bytes)forw_sel.gif (1061 bytes)

 Ana Sayfa