İzlenecek yol: Windows API'larını Çağırma (Visual Basic)
Windows API'leri, Windows işletim sisteminin parçası olan dinamik bağlantı kitaplıklarıdır (DLL'ler). Bunları, kendi eşdeğer yordamlarınızı yazmak zor olduğunda görevleri gerçekleştirmek için kullanırsınız. Örneğin Windows, bir uygulamanın başlık çubuğunu açık ve koyu tonlar arasında geçiş yapmanızı sağlayan adlı FlashWindowEx
bir işlev sağlar.
Kodunuzda Windows API'lerini kullanmanın avantajı, önceden yazılmış ve kullanılmayı bekleyen onlarca yararlı işlev içerdiğinden geliştirme zamanından tasarruf etmelerini sağlamaktır. Dezavantajı, Windows API'leriyle çalışmanın zor olması ve işler yolunda gitmediğinde affedilemez olmasıdır.
Windows API'leri özel bir birlikte çalışabilirlik kategorisini temsil eden bir kategoridir. Windows API'leri yönetilen kod kullanmaz, yerleşik tür kitaplıkları içermez ve Visual Studio ile kullanılanlardan farklı veri türlerini kullanır. Bu farklılıklar nedeniyle ve Windows API'leri COM nesneleri olmadığından, Windows API'leri ve .NET Framework ile birlikte çalışabilirlik platform çağrısı veya PInvoke kullanılarak gerçekleştirilir. Platform çağırma, yönetilen kodun DLL'lerde uygulanan yönetilmeyen işlevleri çağırmasını sağlayan bir hizmettir. Daha fazla bilgi için bkz . Yönetilmeyen DLL İşlevlerini Kullanma. Deyimini kullanarak veya özniteliğini boş bir yordama Declare
uygulayarak DllImport
Visual Basic'te PInvoke kullanabilirsiniz.
Windows API çağrıları geçmişte Visual Basic programlamasının önemli bir parçasıydı, ancak Visual Basic .NET ile nadiren gerekliydi. Mümkün olduğunda, Görevleri gerçekleştirmek için Windows API çağrıları yerine .NET Framework'ten yönetilen kod kullanmanız gerekir. Bu izlenecek yol, Windows API'lerinin kullanılması gereken durumlar için bilgi sağlar.
Not
Bilgisayarınız, aşağıdaki yönergelerde yer alan Visual Studio kullanıcı arabirimi öğelerinden bazıları için farklı adlar veya konumlar gösterebilir. Sahip olduğunuz Visual Studio sürümü ve kullandığınız ayarlar bu öğeleri belirler. Daha fazla bilgi için bkz. IDE’yi kişiselleştirme.
Declare Kullanan API Çağrıları
Windows API'lerini çağırmanın en yaygın yolu deyimini Declare
kullanmaktır.
DLL yordamı bildirmek için
Çağırmak istediğiniz işlevin adını, ayrıca bağımsız değişkenlerini, bağımsız değişken türlerini ve dönüş değerini, ayrıca onu içeren DLL'nin adını ve konumunu belirleyin.
Not
Windows API'leri hakkında tam bilgi için Platform SDK Windows API'sindeki Win32 SDK belgelerine bakın. Windows API'lerinin kullandığı sabitler hakkında daha fazla bilgi için Platform SDK'sı ile birlikte gelen Windows.h gibi üst bilgi dosyalarını inceleyin.
Dosya menüsünde Yeni'ye ve ardından Proje'ye tıklayarak yeni bir Windows Uygulaması projesi açın. Yeni Proje iletişim kutusu görünür.
Visual Basic proje şablonları listesinden Windows Uygulaması'nı seçin. Yeni proje görüntülenir.
DLL'yi kullanmak istediğiniz sınıfa veya modüle aşağıdaki
Declare
işlevi ekleyin:Declare Auto Function MBox Lib "user32.dll" Alias "MessageBox" ( ByVal hWnd As Integer, ByVal txt As String, ByVal caption As String, ByVal Typ As Integer) As Integer
Declare Deyiminin Bölümleri
deyimi Declare
aşağıdaki öğeleri içerir.
Otomatik değiştirici
Değiştirici, Auto
çalışma zamanına dizeyi yöntem adına göre ortak dil çalışma zamanı kurallarına (veya belirtilirse diğer ad) göre dönüştürmesini ister.
Lib ve Diğer Ad anahtar sözcükleri
Anahtar sözcüğünü Function
izleyen ad, programınızın içeri aktarılan işleve erişmek için kullandığı addır. Çağırdığınız işlevin gerçek adıyla aynı olabilir veya geçerli bir yordam adı kullanabilir ve ardından çağırdığınız işlevin gerçek adını belirtmek için anahtar sözcüğünü kullanabilirsiniz Alias
.
Anahtar sözcüğünü Lib
ve ardından çağırdığınız işlevi içeren DLL'nin adını ve konumunu belirtin. Windows sistem dizinlerinde bulunan dosyaların yolunu belirtmeniz gerekmez.
Alias
Çağırdığınız işlevin adı geçerli bir Visual Basic yordam adı değilse veya uygulamanızdaki diğer öğelerin adıyla çakıyorsa anahtar sözcüğünü kullanın. Alias
çağrılan işlevin gerçek adını gösterir.
Bağımsız Değişken ve Veri Türü Bildirimleri
Bağımsız değişkenleri ve bunların veri türlerini bildirin. Windows'un kullandığı veri türleri Visual Studio veri türlerine karşılık gelemediğinden bu bölüm zor olabilir. Visual Basic, bağımsız değişkenleri uyumlu veri türlerine dönüştürerek sizin için büyük bir iş yapar ve sıralama adı verilen bir işlemdir. Ad alanında System.Runtime.InteropServices tanımlanan özniteliği kullanarak bağımsız değişkenlerin MarshalAsAttribute nasıl düzenlendiğini açıkça denetleyebilirsiniz.
Not
Visual Basic'in önceki sürümleri, herhangi bir veri türüne ait verilerin kullanılabileceğini belirten parametreleri As Any
bildirmenize izin verdi. Visual Basic, tüm Declare
deyimler için belirli bir veri türü kullanmanızı gerektirir.
Windows API Sabitleri
Bazı bağımsız değişkenler sabitlerin birleşimidir. Örneğin, bu kılavuzda gösterilen API, MessageBox
ileti kutusunun nasıl görüntüleneceğini denetleen adlı Typ
bir tamsayı bağımsız değişkenini kabul eder. WinUser.h dosyasındaki deyimleri inceleyerek #define
bu sabitlerin sayısal değerini belirleyebilirsiniz. Sayısal değerler genellikle onaltılık olarak gösterilir, bu nedenle bunları eklemek ve ondalık değere dönüştürmek için bir hesap makinesi kullanmak isteyebilirsiniz. Örneğin, ünlem stili 0x00000030 ve Evet/Hayır stili MB_ICONEXCLAMATION
MB_YESNO
0x00000004 için sabitleri birleştirmek istiyorsanız, sayıları ekleyebilir ve 0x00000034 veya 52 ondalık sonucunu alabilirsiniz. Ondalık sonucu doğrudan kullanabilirsiniz, ancak bu değerleri uygulamanızda sabit olarak bildirmek ve işlecini Or
kullanarak birleştirmek daha iyidir.
Windows API çağrıları için sabitleri bildirmek için
Çağırdığınız Windows işlevinin belgelerine bakın. Kullandığı sabitlerin adını ve bu sabitlerin sayısal değerlerini içeren .h dosyasının adını belirleyin.
Üst bilgi (.h) dosyasının içeriğini görüntülemek ve kullandığınız sabitlerle ilişkili değerleri bulmak için Not Defteri gibi bir metin düzenleyicisi kullanın. Örneğin API,
MessageBox
ileti kutusunda soru işareti göstermek için sabitiniMB_ICONQUESTION
kullanır. içinMB_ICONQUESTION
tanımı WinUser.h içindedir ve aşağıdaki gibi görünür:#define MB_ICONQUESTION 0x00000020L
Bu sabitleri uygulamanız için kullanılabilir hale getirmek için sınıfınıza veya modülünüze eşdeğer
Const
deyimler ekleyin. Örneğin:Const MB_ICONQUESTION As Integer = &H20 Const MB_YESNO As Integer = &H4 Const IDYES As Integer = 6 Const IDNO As Integer = 7
DLL yordamını çağırmak için
Projenizin başlangıç formuna adlı
Button1
bir düğme ekleyin ve kodunu görüntülemek için çift tıklayın. Düğmenin olay işleyicisi görüntülenir.Yordamı çağırmak
Click
ve uygun bağımsız değişkenleri sağlamak için eklediğiniz düğmenin olay işleyicisine kod ekleyin:Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' Stores the return value. Dim RetVal As Integer RetVal = MBox(0, "Declare DLL Test", "Windows API MessageBox", MB_ICONQUESTION Or MB_YESNO) ' Check the return value. If RetVal = IDYES Then MsgBox("You chose Yes") Else MsgBox("You chose No") End If End Sub
F5 tuşuna basarak projeyi çalıştırın. İleti kutusu hem Evethem de Hayır yanıt düğmeleriyle görüntülenir. Bunlardan birine tıklayın.
Veri Hazırlama
Visual Basic, Windows API çağrıları için parametre ve dönüş değerlerinin veri türlerini otomatik olarak dönüştürür, ancak api'nin beklediği yönetilmeyen veri türlerini açıkça belirtmek için özniteliğini kullanabilirsiniz MarshalAs
. Birlikte çalışma hazırlama hakkında daha fazla bilgi için bkz . Birlikte Çalışma Hazırlama.
BIR API çağrısında Declare ve MarshalAs kullanmak için
Çağırmak istediğiniz işlevin adını, ayrıca bağımsız değişkenlerini, veri türlerini ve dönüş değerini belirleyin.
Özniteliğine
MarshalAs
erişimi basitleştirmek için, aşağıdaki örnekte olduğu gibi sınıfın veya modülün kodunun en üstüne birImports
deyim ekleyin:Imports System.Runtime.InteropServices
İçeri aktarılan işlev için kullandığınız sınıfa veya modüle bir işlev prototipi ekleyin ve özniteliğini parametrelere veya dönüş değerine uygulayın
MarshalAs
. Aşağıdaki örnekte, türünüvoid*
bekleyen bir API çağrısı olarakAsAny
sıralanır:Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" ( ByVal x As Short, <MarshalAsAttribute(UnmanagedType.AsAny)> ByVal o As Object)
DllImport Kullanan API Çağrıları
özniteliği, DllImport
tür kitaplıkları olmadan DLL'lerdeki işlevleri çağırmak için ikinci bir yol sağlar. DllImport
kabaca bir Declare
deyimi kullanmakla eşdeğerdir, ancak işlevlerin nasıl çağrıldığı üzerinde daha fazla denetim sağlar.
Çağrı paylaşılan (bazen statik olarak da adlandırılır) yöntemine başvurduğu sürece çoğu Windows API çağrısıyla kullanabilirsinizDllImport
. Bir sınıfın örneğini gerektiren yöntemleri kullanamazsınız. Deyimlerin aksine Declare
, DllImport
çağrılar özniteliğini MarshalAs
kullanamaz.
DllImport özniteliğini kullanarak bir Windows API'sini çağırmak için
Dosya menüsünde Yeni'ye ve ardından Proje'ye tıklayarak yeni bir Windows Uygulaması projesi açın. Yeni Proje iletişim kutusu görünür.
Visual Basic proje şablonları listesinden Windows Uygulaması'nı seçin. Yeni proje görüntülenir.
Başlangıç formuna adlı
Button2
bir düğme ekleyin.Formun kod görünümünü açmak için çift tıklayın
Button2
.öğesine erişimi basitleştirmek için
DllImport
başlangıç formu sınıfının kodunun en üstüne birImports
deyim ekleyin:Imports System.Runtime.InteropServices
Formun deyiminden
End Class
önce boş bir işlev bildirin ve işleviMoveFile
olarak adlandırın.Public
veShared
değiştiricilerini işlev bildirimine uygulayın ve Windows API işlevinin kullandığı bağımsız değişkenlere göre parametreleriniMoveFile
ayarlayın:Public Shared Function MoveFile( ByVal src As String, ByVal dst As String) As Boolean ' Leave the body of the function empty. End Function
İşlevinizin geçerli bir yordam adı olabilir;
DllImport
özniteliği DLL'deki adı belirtir. Ayrıca parametreler ve dönüş değerleri için birlikte çalışabilirlik sıralamasını işler, böylece API'nin kullandığı veri türlerine benzer Visual Studio veri türlerini seçebilirsiniz.özniteliğini
DllImport
boş işleve uygulayın. İlk parametre, çağırdığınız işlevi içeren DLL'nin adı ve konumudur. Windows sistem dizinlerinde bulunan dosyaların yolunu belirtmeniz gerekmez. İkinci parametre, Windows API'sindeki işlevin adını belirten adlandırılmış bir bağımsız değişkendir. Bu örnekte özniteliği, çağrılarıDllImport
MoveFile
KERNEL32.DLL'da iletilecek şekildeMoveFileW
zorlar. yöntemi,MoveFileW
yolundan yolunasrc
dst
bir dosya kopyalar.<DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True, CharSet:=CharSet.Unicode, ExactSpelling:=True, CallingConvention:=CallingConvention.StdCall)> Public Shared Function MoveFile( ByVal src As String, ByVal dst As String) As Boolean ' Leave the body of the function empty. End Function
İşlevi
Button2_Click
çağırmak için olay işleyicisine kod ekleyin:Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim RetVal As Boolean = MoveFile("c:\tmp\Test.txt", "c:\Test.txt") If RetVal = True Then MsgBox("The file was moved successfully.") Else MsgBox("The file could not be moved.") End If End Sub
Test.txt adlı bir dosya oluşturun ve sabit sürücünüzdeki C:\Tmp dizinine yerleştirin. Gerekirse Tmp dizinini oluşturun.
Uygulamayı başlatmak için F5 tuşuna basın. Ana form görüntülenir.
Düğme2'ye tıklayın. Dosya taşınabiliyorsa "Dosya başarıyla taşındı" iletisi görüntülenir.