Wskazówki: wywoływanie Windows API (Visual Basic)

Interfejsy API systemu Windows to biblioteki linków dynamicznych (DLL), które są częścią systemu operacyjnego Windows. Są one używane do wykonywania zadań, gdy trudno jest pisać równoważne procedury. Na przykład system Windows udostępnia funkcję o nazwie FlashWindowEx , która umożliwia ustawienie paska tytułu dla aplikacji alternatywnej między jasnymi i ciemnymi odcieniami.

Zaletą korzystania z interfejsów API systemu Windows w kodzie jest to, że mogą zaoszczędzić czas programowania, ponieważ zawierają dziesiątki przydatnych funkcji, które są już napisane i oczekujące na użycie. Wadą jest to, że interfejsy API systemu Windows mogą być trudne do pracy z i niewygodne, gdy coś pójdzie źle.

Interfejsy API systemu Windows reprezentują specjalną kategorię współdziałania. Interfejsy API systemu Windows nie używają kodu zarządzanego, nie mają wbudowanych bibliotek typów i używają typów danych innych niż używane w programie Visual Studio. Ze względu na te różnice i dlatego, że interfejsy API systemu Windows nie są obiektami COM, współdziałanie z interfejsami API systemu Windows i program .NET Framework jest wykonywany przy użyciu wywołania platformy lub funkcji PInvoke. Wywołanie platformy to usługa, która umożliwia kodowi zarządzanemu wywoływanie funkcji niezarządzanych zaimplementowanych w bibliotekach DLL. Aby uzyskać więcej informacji, zobacz Korzystanie z niezarządzanych funkcji DLL. Możesz użyć funkcji PInvoke w języku Visual Basic przy użyciu Declare instrukcji lub zastosowania atrybutu DllImport do pustej procedury.

Wywołania interfejsu API systemu Windows były ważną częścią programowania w języku Visual Basic w przeszłości, ale rzadko są niezbędne w przypadku platformy .NET języka Visual Basic. Jeśli to możliwe, należy użyć kodu zarządzanego z programu .NET Framework do wykonywania zadań zamiast wywołań interfejsu API systemu Windows. Ten przewodnik zawiera informacje dotyczące tych sytuacji, w których konieczne jest używanie interfejsów API systemu Windows.

Uwaga

Na komputerze w poniższych instrukcjach mogą być wyświetlane inne nazwy i lokalizacje niektórych elementów interfejsu użytkownika programu Visual Studio. Te elementy są określane przez numer wersji Visual Studio oraz twoje ustawienia. Aby uzyskać więcej informacji, zobacz Personalizowanie środowiska IDE.

Wywołania interfejsu API przy użyciu deklarowania

Najczęstszym sposobem wywoływania interfejsów API systemu Windows jest użycie instrukcji Declare .

Aby zadeklarować procedurę dll

  1. Określ nazwę funkcji, którą chcesz wywołać, oraz jej argumenty, typy argumentów i wartość zwracaną, a także nazwę i lokalizację biblioteki DLL, która ją zawiera.

    Uwaga

    Aby uzyskać pełne informacje na temat interfejsów API systemu Windows, zobacz dokumentację zestawu SDK win32 w interfejsie API systemu Windows dla zestawu SDK platformy. Aby uzyskać więcej informacji na temat stałych używanych przez interfejsy API systemu Windows, zapoznaj się z plikami nagłówków, takimi jak Windows.h dołączonymi do zestawu SDK platformy.

  2. Otwórz nowy projekt aplikacji systemu Windows, klikając pozycję Nowy w menu Plik , a następnie klikając pozycję Projekt. Zostanie wyświetlone okno dialogowe Nowy projekt.

  3. Wybierz pozycję Aplikacja systemu Windows z listy szablonów projektów Visual Basic. Zostanie wyświetlony nowy projekt.

  4. Dodaj następującą Declare funkcję do klasy lub modułu, w którym chcesz użyć biblioteki DLL:

    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
    

Części instrukcji Declare

Instrukcja Declare zawiera następujące elementy.

Modyfikator automatyczny

Modyfikator Auto instruuje środowisko uruchomieniowe, aby przekonwertowało ciąg na podstawie nazwy metody zgodnie z regułami środowiska uruchomieniowego języka wspólnego (lub nazwą aliasu, jeśli określono).

Słowa kluczowe Lib i Alias

Nazwa po słowie Function kluczowym to nazwa używana przez program do uzyskiwania dostępu do zaimportowanych funkcji. Może to być taka sama jak rzeczywista nazwa wywoływanej funkcji lub można użyć dowolnej prawidłowej nazwy procedury, a następnie użyć Alias słowa kluczowego , aby określić rzeczywistą nazwę wywoływanej funkcji.

Lib Określ słowo kluczowe, a następnie nazwę i lokalizację biblioteki DLL, która zawiera wywoływaną funkcję. Nie trzeba określać ścieżki dla plików znajdujących się w katalogach systemowych systemu Windows.

Alias Użyj słowa kluczowego , jeśli nazwa wywoływanej funkcji nie jest prawidłową nazwą procedury języka Visual Basic lub powoduje konflikt z nazwą innych elementów w aplikacji. Alias wskazuje prawdziwą nazwę wywoływanej funkcji.

Deklaracje argumentów i typów danych

Zadeklaruj argumenty i ich typy danych. Ta część może być trudna, ponieważ typy danych używane przez system Windows nie odpowiadają typom danych programu Visual Studio. Visual Basic wykonuje wiele pracy, konwertując argumenty na zgodne typy danych, czyli proces nazywany marshalingiem. Możesz jawnie kontrolować sposób działania argumentów przy użyciu atrybutu zdefiniowanego MarshalAsAttributeSystem.Runtime.InteropServices w przestrzeni nazw.

Uwaga

Poprzednie wersje języka Visual Basic umożliwiają deklarowanie parametrów As Any, co oznacza, że mogą być używane dane dowolnego typu danych. Język Visual Basic wymaga użycia określonego typu danych dla wszystkich Declare instrukcji.

Stałe interfejsu API systemu Windows

Niektóre argumenty to kombinacje stałych. Na przykład MessageBox interfejs API pokazany w tym przewodniku akceptuje argument liczby całkowitej o nazwie Typ , który kontroluje sposób wyświetlania okna komunikatu. Można określić wartość liczbową tych stałych, sprawdzając #define instrukcje w pliku WinUser.h. Wartości liczbowe są zwykle wyświetlane w szesnastkowym, więc możesz użyć kalkulatora, aby dodać je i przekonwertować na dziesiętne. Jeśli na przykład chcesz połączyć stałe dla stylu MB_ICONEXCLAMATION wykrzyknika 0x00000030 i styl MB_YESNO Tak/Nie 0x00000004, możesz dodać liczby i uzyskać wynik 0x00000034 lub 52 dziesiętne. Chociaż można bezpośrednio użyć wyniku dziesiętnego, lepiej zadeklarować te wartości jako stałe w aplikacji i połączyć je za pomocą Or operatora .

Aby zadeklarować stałe dla wywołań interfejsu API systemu Windows
  1. Zapoznaj się z dokumentacją wywoływanej funkcji systemu Windows. Określ nazwę używanych stałych oraz nazwę pliku .h, który zawiera wartości liczbowe dla tych stałych.

  2. Użyj edytora tekstów, takiego jak Notatnik, aby wyświetlić zawartość pliku nagłówka (h) i znaleźć wartości skojarzone z używanymi stałymi. Na przykład MessageBox interfejs API używa stałej MB_ICONQUESTION do wyświetlania znaku zapytania w polu komunikatu. Definicja elementu MB_ICONQUESTION znajduje się w pliku WinUser.h i jest wyświetlana w następujący sposób:

    #define MB_ICONQUESTION 0x00000020L

  3. Dodaj równoważne Const instrukcje do klasy lub modułu, aby udostępnić te stałe aplikacji. Na przykład:

    Const MB_ICONQUESTION As Integer = &H20
    Const MB_YESNO As Integer = &H4
    Const IDYES As Integer = 6
    Const IDNO As Integer = 7
    
Aby wywołać procedurę DLL
  1. Dodaj przycisk o nazwie Button1 do formularza uruchamiania projektu, a następnie kliknij go dwukrotnie, aby wyświetlić jego kod. Zostanie wyświetlona procedura obsługi zdarzeń dla przycisku.

  2. Dodaj kod do Click procedury obsługi zdarzeń dla dodanego przycisku, aby wywołać procedurę i podać odpowiednie argumenty:

    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. Uruchom projekt, naciskając klawisz F5. Zostanie wyświetlone okno komunikatu z przyciskami Tak i Bez odpowiedzi. Kliknij jedną z nich.

Marshalling danych

Visual Basic automatycznie konwertuje typy danych parametrów i zwracane wartości dla wywołań interfejsu API systemu Windows, ale można użyć atrybutu MarshalAs do jawnego określenia niezarządzanych typów danych, których oczekuje interfejs API. Aby uzyskać więcej informacji na temat marshalingu międzyoperacyjnej, zobacz Interop Marshaling (Marshaling interop marshaling).

Aby użyć funkcji Deklarowanie i MarshalAs w wywołaniu interfejsu API
  1. Określ nazwę funkcji, którą chcesz wywołać, oraz jej argumenty, typy danych i wartość zwracaną.

  2. Aby uprościć dostęp do atrybutu MarshalAs , dodaj instrukcję Imports na początku kodu dla klasy lub modułu, jak w poniższym przykładzie:

    Imports System.Runtime.InteropServices
    
  3. Dodaj prototyp funkcji dla zaimportowanej funkcji do używanej klasy lub modułu i zastosuj MarshalAs atrybut do parametrów lub wartości zwracanej. W poniższym przykładzie wywołanie interfejsu API, które oczekuje, że typ void* jest marshalled jako AsAny:

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

Wywołania interfejsu API przy użyciu biblioteki DllImport

Atrybut DllImport zapewnia drugi sposób wywoływania funkcji w bibliotekach DLL bez bibliotek typów. DllImport jest w przybliżeniu odpowiednikiem używania Declare instrukcji, ale zapewnia większą kontrolę nad sposobem wywoływannia funkcji.

W przypadku większości wywołań interfejsu API systemu Windows można używać DllImport tak długo, jak wywołanie odnosi się do metody udostępnionej (czasami nazywanej statyczną). Nie można używać metod, które wymagają wystąpienia klasy. W przeciwieństwie do instrukcji Declare wywołania DllImport nie mogą używać atrybutu MarshalAs .

Aby wywołać interfejs API systemu Windows przy użyciu atrybutu DllImport

  1. Otwórz nowy projekt aplikacji systemu Windows, klikając pozycję Nowy w menu Plik , a następnie klikając pozycję Projekt. Zostanie wyświetlone okno dialogowe Nowy projekt.

  2. Wybierz pozycję Aplikacja systemu Windows z listy szablonów projektów Visual Basic. Zostanie wyświetlony nowy projekt.

  3. Dodaj przycisk o nazwie Button2 do formularza uruchamiania.

  4. Button2 Kliknij dwukrotnie, aby otworzyć widok kodu formularza.

  5. Aby uprościć dostęp do DllImportelementu , dodaj instrukcję Imports na początku kodu dla klasy formularza uruchamiania:

    Imports System.Runtime.InteropServices
    
  6. Zadeklaruj pustą funkcję poprzedzającą instrukcję End Class formularza i nadaj funkcji MoveFilenazwę .

  7. Public Zastosuj modyfikatory i Shared do deklaracji funkcji i ustaw parametry dla na MoveFile podstawie argumentów używanych przez funkcję interfejsu API systemu Windows:

    Public Shared Function MoveFile(
        ByVal src As String,
        ByVal dst As String) As Boolean
        ' Leave the body of the function empty.
    End Function
    

    Funkcja może mieć dowolną prawidłową nazwę procedury; atrybut DllImport określa nazwę w dll. Obsługuje również marshalling współdziałania parametrów i zwracanych wartości, dzięki czemu można wybrać typy danych programu Visual Studio podobne do typów danych używanych przez interfejs API.

  8. DllImport Zastosuj atrybut do pustej funkcji. Pierwszy parametr to nazwa i lokalizacja biblioteki DLL zawierającej wywoływaną funkcję. Nie trzeba określać ścieżki dla plików znajdujących się w katalogach systemowych systemu Windows. Drugi parametr jest nazwanym argumentem, który określa nazwę funkcji w interfejsie API systemu Windows. W tym przykładzie DllImport atrybut wymusza przekazywanie wywołań MoveFile do MoveFileW elementu w KERNEL32.DLL. Metoda MoveFileW kopiuje plik ze ścieżki src do ścieżki 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. Dodaj kod do programu obsługi zdarzeń Button2_Click , aby wywołać funkcję:

    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. Utwórz plik o nazwie Test.txt i umieść go w katalogu C:\Tmp na dysku twardym. W razie potrzeby utwórz katalog Tmp.

  11. Naciśnij klawisz F5, aby uruchomić aplikację. Zostanie wyświetlony formularz główny.

  12. Kliknij przycisk2. Jeśli plik można przenieść, zostanie wyświetlony komunikat "Plik został pomyślnie przeniesiony".

Zobacz też