Udostępnij za pośrednictwem


Przewodnik: wywoływanie interfejsów API systemu Windows (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 w obsłudze i bezlitosne, gdy coś się nie uda.

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 oraz fakt, że interfejsy API systemu Windows nie są obiektami COM, współdziałanie z interfejsami API systemu Windows i platformą .NET Framework odbywa się poprzez wykorzystanie mechanizmu wywoływania platformy, znanego jako PInvoke. Wywoływanie platformowe to mechanizm, który 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 są rzadko potrzebne w Visual Basic .NET. 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 / Notatka

Na komputerze mogą być wyświetlane różne nazwy lub lokalizacje niektórych elementów interfejsu użytkownika programu Visual Studio w poniższych instrukcjach. Wersja programu Visual Studio i ustawienia, których używasz, określają te elementy. 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 / Notatka

    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 w interfejsach API Windows, sprawdź pliki nagłówkowe, takie jak *Windows.h* zawarte w Platform SDK.

  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ć, w jaki sposób argumenty są przekazywane, używając atrybutu zdefiniowanego w przestrzeni nazw MarshalAsAttributeSystem.Runtime.InteropServices.

Uwaga / Notatka

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 opisany 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, przeglądając polecenia #define w pliku WinUser.h. Wartości numeryczne są zwykle wyświetlane w systemie szesnastkowym, więc możesz użyć kalkulatora do ich dodawania i konwersji na system dziesiętny. Jeśli na przykład chcesz połączyć stałe dla stylu MB_ICONEXCLAMATION wykrzyknika 0x00000030 i stylu MB_YESNO Tak/Nie 0x00000004, możesz dodać te liczby, aby uzyskać wynik 0x00000034 lub 52 w systemie dziesiętnym. 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 interfejs API MessageBox 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 te stałe były dostępne dla aplikacji. 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 F5. Zostanie wyświetlone okno komunikatu z przyciskami Tak i Bez odpowiedzi. Kliknij jedną z nich.

Maszerowanie 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ędzyoperacyjnego, zobacz Interop Marshaling.

Aby użyć Declare i MarshalAs w wywołaniu 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* zostaje przetworzony jako AsAny:

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

Wywołania API z użyciem 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 DllImport, dodaj polecenie Imports na początku kodu dla klasy formularza startowego:

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

  7. Zastosuj modyfikatory Public oraz Shared do deklaracji funkcji i ustaw parametry dla MoveFile na 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ż przekazywanie danych dla kompatybilności współdziałania parametrów i wartości zwracanych, dzięki czemu można wybrać typy danych w programie Visual Studio, które są podobne do tych używanych w interfejsie 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 atrybut DllImport wymusza przekazywanie wywołań MoveFile do MoveFileW 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 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 także