İzlenecek yol: Windows API'larını Çağırma (Visual Basic)

Windows apı 'ler, Windows işletim sisteminin bir parçası olan dinamik bağlantı kitaplıkları (dll). Bunları kendi kendine eşdeğer prosedürleri yazmak zor olduğunda görevleri gerçekleştirmek için kullanabilirsiniz. örneğin, Windows, FlashWindowEx açık ve koyu gölgeler arasında bir uygulama için başlık çubuğunu yapmanızı sağlayan adlı bir işlev sağlar.

kodunuzda Windows apı kullanmanın avantajı, önceden yazılmış ve kullanımı bekleyen çok sayıda faydalı işlev içerdiğinden, geliştirme süresini kaydedebildiğinden. olumsuz bir deyişle Windows apı 'lerin, şeyler yanlış gitmeye devam edildiğinde ve onları geri almak zor olabilir.

Windows API 'Ler özel bir birlikte çalışabilirlik kategorisini temsil eder. Windows API 'Ler yönetilen kod kullanmaz, yerleşik tür kitaplıkları yoktur ve Visual Studio ile kullanılandan farklı veri türlerini kullanır. bu farklılıklar nedeniyle ve Windows apı 'leri COM nesneleri olmadığından, Windows apı 'lerle birlikte çalışabilirlik ve .NET Framework platform ınvoke veya pınvoke kullanılarak gerçekleştirilir. Platform çağırma, yönetilen kodun DLL 'lerde uygulanan yönetilmeyen işlevleri çağırmasına olanak sağlayan bir hizmettir. Daha fazla bilgi için bkz. YÖNETILMEYEN DLL işlevlerinikullanma. Visual Basic ' de, Declare ifadesini kullanarak veya DllImport özniteliğini boş bir yordama uygulayarak, pınvoke kullanabilirsiniz.

Windows apı çağrıları geçmişte Visual Basic programlamanın önemli bir parçasıdır, ancak Visual Basic .net ile nadiren gerekli değildir. mümkün olduğunda, Windows apı çağrıları yerine görevleri gerçekleştirmek için .NET Framework yönetilen kodu kullanmanız gerekir. bu izlenecek yol, Windows apı 'leri kullanmanın gerekli olduğu durumlar hakkında 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 apı 'leri çağırmak için en yaygın yol, Declare ifadesini kullanmaktır.

Bir 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 ve onu içeren DLL 'nin adını ve konumunu saptayın.

    Not

    Windows apı 'leri hakkında tüm bilgiler için Platform sdk Windows apı 'sindeki Win32 sdk belgelerine bakın. Windows apı 'leri tarafından kullanılan sabitler hakkında daha fazla bilgi için Platform SDK ile birlikte bulunan Windows. h gibi üst bilgi dosyalarını inceleyin.

  2. dosya menüsünde yeni ' ye ve ardından Project' a tıklayarak yeni bir Windows uygulama projesi açın. Yeni Proje iletişim kutusu görünür.

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

  4. Aşağıdaki işlevi, Declare DLL 'yi kullanmak istediğiniz sınıfa veya modüle 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 Ifadesinin kısımları

DeclareBu ifade aşağıdaki öğeleri içerir.

Otomatik değiştirici

AutoDeğiştirici, çalışma zamanına, ortak dil çalışma zamanı kurallarına (veya belirtilmişse diğer ad) göre Yöntem adına göre dize dönüştürmesini söyler.

Lib ve Alias anahtar sözcükleri

Anahtar sözcüğünü izleyen ad, Function programınızın içeri aktarılan işleve erişmek için kullandığı addır. Bu, aradığınız işlevin gerçek adı ile aynı olabilir veya herhangi bir geçerli yordam adı kullanabilir ve sonra, Alias Aradığınız işlevin gerçek adını belirtmek için anahtar sözcüğünü kullanabilirsiniz.

LibAnahtar sözcüğünü ve ardından, aradığınız işlevi IÇEREN dll 'nin adını ve konumunu belirtin. Windows sistem dizinlerinde bulunan dosyalar için yol belirtmeniz gerekmez.

Aliasaradığınız işlevin adı geçerli bir Visual Basic yordam adı değilse veya uygulamanızdaki diğer öğelerin adı ile çakışıyorsa, anahtar sözcüğünü kullanın. Alias çağrılan işlevin doğru adını gösterir.

Bağımsız değişken ve veri türü bildirimleri

Bağımsız değişkenleri ve veri türlerini bildirin. Windows kullandığı veri türleri Visual Studio veri türlerine karşılık gelmediğinden, bu bölüm zor olabilir. Visual Basic, değişkenleri sıralama adlı bir işlem olan uyumlu veri türlerine dönüştürerek sizin için çok sayıda iş yapar. MarshalAsAttributeAd alanında tanımlanan özniteliği kullanarak bağımsız değişkenlerin nasıl sıralanarak açıkça kontrol edebilirsiniz System.Runtime.InteropServices .

Not

önceki Visual Basic sürümleri, parametreleri bildirmenize izin As Any ver, yani herhangi bir veri türü verisinin kullanılabileceği anlamına gelir. Visual Basic, tüm deyimler için belirli bir veri türü kullanmanızı gerektirir Declare .

Windows API sabitleri

Bazı bağımsız değişkenler sabitler birleşimleridir. Örneğin, MessageBox Bu izlenecek yolda gösterilen API, Typ ileti kutusunun nasıl görüntülendiğini denetleyen adlı bir tamsayı bağımsız değişkenini kabul eder. WinUser. h dosyasındaki deyimleri inceleyerek, bu sabitlerin sayısal değerini belirleyebilirsiniz #define . Sayısal değerler genellikle onaltılı olarak gösterilir, bu nedenle bunları eklemek ve Decimal 'a dönüştürmek için bir Hesaplayıcı kullanmak isteyebilirsiniz. Örneğin, ünlem stili MB_ICONEXCLAMATION 0x00000030 ve Evet/Hayır stili MB_YESNO 0x00000004 olan sabitleri birleştirmek istiyorsanız, sayıları ekleyebilir ve 0x00000034 veya 52 ondalık sonucunu elde edebilirsiniz. Ondalık sonucunu doğrudan kullanabilseniz de, bu değerleri uygulamanızda sabitler olarak bildirmek ve işlecini kullanarak birleştirmek daha iyidir Or .

Windows apı çağrılarının sabitlerini bildirmek için
  1. aradığınız Windows işlevi için belgelere başvurun. Kullandığı sabitlerin adını ve bu sabitler için sayısal değerleri içeren. h dosyasının adını saptayın.

  2. Not Defteri gibi bir metin düzenleyicisini kullanarak üst bilgi (. h) dosyasının içeriğini görüntüleyin ve kullandığınız sabitler ile ilişkili değerleri bulun. Örneğin, API, MessageBox MB_ICONQUESTION ileti kutusunda bir soru işareti göstermek için sabiti kullanır. Tanımı MB_ICONQUESTION WinUser. h ' dir ve şu şekilde görünür:

    #define MB_ICONQUESTION 0x00000020L

  3. ConstBu sabitleri uygulamanız için kullanılabilir hale getirmek için sınıfınıza veya modülünüzü eşdeğer deyimler ekleyin. Örnek:

    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. Button1Projeniz için başlangıç formuna adlı bir düğme ekleyin ve sonra kodunu görüntülemek için çift tıklayın. Düğme için olay işleyicisi görüntülenir.

  2. ClickYordamı çağırmak 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 Evet hem de yanıt düğmesi olmadan görüntülenir. Birine tıklayın.

Veri sıralama

Visual Basic, Windows apı çağrıları için parametrelerin veri türlerini ve dönüş değerlerini otomatik olarak dönüştürür, ancak MarshalAs bir apı 'nin beklediği yönetilmeyen veri türlerini açıkça belirtmek için özniteliğini kullanabilirsiniz. Birlikte çalışabilirlik sıralaması hakkında daha fazla bilgi için bkz. Interop Marshal.

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 saptayın.

  2. Özniteliğe erişimi basitleştirmek için MarshalAs , Imports Aşağıdaki örnekte olduğu gibi sınıf veya modül için kodun en üstüne bir ifade 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 MarshalAs özniteliği parametrelere veya dönüş değerine uygulayın. Aşağıdaki örnekte, türü bekleyen bir API çağrısı void* şöyle sıralanır AsAny :

    Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" (
        ByVal x As Short,
        <MarshalAsAttribute(UnmanagedType.AsAny)>
            ByVal o As Object)
    

DllImport kullanan API çağrıları

DllImportÖzniteliği, dll 'lerdeki işlevleri tür kitaplıkları olmadan çağırmak için ikinci bir yol sağlar. DllImport , bir deyimin kullanımı için kabaca eşdeğerdir, Declare ancak işlevlerin nasıl çağrıldığı üzerinde daha fazla denetim sağlar.

DllImportçağrı paylaşılan (bazen statik olarak adlandırılır) yöntemine başvurduğu sürece, en Windows apı çağrısı ile kullanabilirsiniz. Bir sınıf örneği gerektiren yöntemleri kullanamazsınız. DeclareDeyimlerden farklı olarak, DllImport çağrılar MarshalAs özniteliği kullanamaz.

dllımport özniteliğini kullanarak bir Windows apı 'si çağırmak için

  1. dosya menüsünde yeni ' ye ve ardından Project' a tıklayarak yeni bir Windows uygulama projesi açın. Yeni Proje iletişim kutusu görünür.

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

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

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

  5. Erişimini basitleştirmek için DllImport , Imports Başlangıç Form sınıfı için kodun en üstüne bir ifade ekleyin:

    Imports System.Runtime.InteropServices
    
  6. Form için olan deyimden önceki boş bir işlev bildirin End Class ve işlevi adlandırın MoveFile .

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

    İşleviniz geçerli bir yordam adına sahip olabilir; DllImport öznitelik, dll 'de adı belirtir. ayrıca parametreler ve dönüş değerleri için birlikte çalışabilirlik sıralamasını işler ve apı 'nin kullandığı veri türlerine benzer Visual Studio veri türleri seçebilirsiniz.

  8. DllImportÖzniteliği boş işleve uygulayın. İlk parametre, aradığınız işlevi içeren DLL 'nin adı ve konumudur. Windows sistem dizinlerinde bulunan dosyalar için yol belirtmeniz gerekmez. ikinci parametre, Windows apı 'sindeki işlevin adını belirten adlandırılmış bir bağımsız değişkendir. Bu örnekte, DllImport özniteliği MoveFile MoveFileW KERNEL32.DLL ' de ' e iletime çağrısı yapılmasını zorlar. MoveFileWYöntemi yolu yolundan bir dosya kopyalar src dst .

    <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. Button2_Clickİşlevi ç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 bu dosyayı 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. Button2'ye tıklayın. Dosya taşınabilmesi durumunda "dosya başarıyla taşındı" iletisi görüntülenir.

Ayrıca bkz.