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
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.
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.
Wybierz pozycję Aplikacja systemu Windows z listy szablonów projektów Visual Basic. Zostanie wyświetlony nowy projekt.
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
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.
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łejMB_ICONQUESTION
do wyświetlania znaku zapytania w polu komunikatu. Definicja elementuMB_ICONQUESTION
znajduje się w pliku WinUser.h i jest wyświetlana w następujący sposób:#define MB_ICONQUESTION 0x00000020L
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
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.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
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
Określ nazwę funkcji, którą chcesz wywołać, oraz jej argumenty, typy danych i wartość zwracaną.
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
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 typvoid*
jest marshalled jakoAsAny
: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
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.
Wybierz pozycję Aplikacja systemu Windows z listy szablonów projektów Visual Basic. Zostanie wyświetlony nowy projekt.
Dodaj przycisk o nazwie
Button2
do formularza uruchamiania.Button2
Kliknij dwukrotnie, aby otworzyć widok kodu formularza.Aby uprościć dostęp do
DllImport
elementu , dodaj instrukcjęImports
na początku kodu dla klasy formularza uruchamiania:Imports System.Runtime.InteropServices
Zadeklaruj pustą funkcję poprzedzającą instrukcję
End Class
formularza i nadaj funkcjiMoveFile
nazwę .Public
Zastosuj modyfikatory iShared
do deklaracji funkcji i ustaw parametry dla naMoveFile
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.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ładzieDllImport
atrybut wymusza przekazywanie wywołańMoveFile
doMoveFileW
elementu w KERNEL32.DLL. MetodaMoveFileW
kopiuje plik ze ścieżkisrc
do ścieżkidst
.<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
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
Utwórz plik o nazwie Test.txt i umieść go w katalogu C:\Tmp na dysku twardym. W razie potrzeby utwórz katalog Tmp.
Naciśnij klawisz F5, aby uruchomić aplikację. Zostanie wyświetlony formularz główny.
Kliknij przycisk2. Jeśli plik można przenieść, zostanie wyświetlony komunikat "Plik został pomyślnie przeniesiony".