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" As Type Declare Sub publicname Lib "libname" Kütühane İsmi 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" As Long Private Sub Command1_Click Dim n As Integer Dim str As String str = Space$(100) n = WindowsDiziniGoster(str, 100) Label1. Caption = Left$ 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" 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" _ As Long Dim rect1 As RECT Private Sub Form_Load ScaleMode = 3 End Sub Private Sub Form_MouseDown 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 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" As Long Bu yordamın kullanılışı aşağıdaki gibi olabilir. hWndExcel = FindWindow 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.