İ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

  1. Ç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.

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

  3. Visual Basic proje şablonları listesinden Windows Uygulaması'nı seçin. Yeni proje görüntülenir.

  4. 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 Anybildirmenize 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_ICONEXCLAMATIONMB_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
  1. Ç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.

  2. Ü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 sabitini MB_ICONQUESTION kullanır. için MB_ICONQUESTION tanımı WinUser.h içindedir ve aşağıdaki gibi görünür:

    #define MB_ICONQUESTION 0x00000020L

  3. 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
  1. 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.

  2. 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
    
  3. 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
  1. Ç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.

  2. Ö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 bir Imports deyim ekleyin:

    Imports System.Runtime.InteropServices
    
  3. İç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ı olarak AsAnysı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

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

  2. Visual Basic proje şablonları listesinden Windows Uygulaması'nı seçin. Yeni proje görüntülenir.

  3. Başlangıç formuna adlı Button2 bir düğme ekleyin.

  4. Formun kod görünümünü açmak için çift tıklayın Button2 .

  5. öğesine erişimi basitleştirmek için DllImportbaşlangıç formu sınıfının kodunun en üstüne bir Imports deyim ekleyin:

    Imports System.Runtime.InteropServices
    
  6. Formun deyiminden End Class önce boş bir işlev bildirin ve işlevi MoveFileolarak adlandırın.

  7. Public ve Shared değiştiricilerini işlev bildirimine uygulayın ve Windows API işlevinin kullandığı bağımsız değişkenlere göre parametrelerini MoveFile 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.

  8. ö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ı DllImportMoveFile KERNEL32.DLL'da iletilecek şekilde MoveFileW zorlar. yöntemi, MoveFileW yolundan yoluna srcdstbir 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
    
  9. İş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
    
  10. Test.txt adlı bir dosya oluşturun ve sabit sürücünüzdeki C:\Tmp dizinine yerleştirin. Gerekirse Tmp dizinini oluşturun.

  11. Uygulamayı başlatmak için F5 tuşuna basın. Ana form görüntülenir.

  12. Düğme2'ye tıklayın. Dosya taşınabiliyorsa "Dosya başarıyla taşındı" iletisi görüntülenir.

Ayrıca bkz.