Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
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.
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ą
Declarefunkcję 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
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 interfejs API
MessageBoxużywa stałejMB_ICONQUESTIONdo wyświetlania znaku zapytania w polu komunikatu. Definicja elementuMB_ICONQUESTIONznajduje się w pliku WinUser.h i jest wyświetlana w następujący sposób:#define MB_ICONQUESTION 0x00000020LDodaj równoważne
Constinstrukcje 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
Dodaj przycisk o nazwie
Button1do 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
Clickprocedury 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 SubUruchom 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
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ęImportsna początku kodu dla klasy lub modułu, jak w poniższym przykładzie:Imports System.Runtime.InteropServicesDodaj prototyp funkcji dla zaimportowanej funkcji do używanej klasy lub modułu i zastosuj
MarshalAsatrybut do parametrów lub wartości zwracanej. W poniższym przykładzie wywołanie interfejsu API, które oczekuje, że typvoid*zostaje przetworzony jakoAsAny: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
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
Button2do formularza uruchamiania.Button2Kliknij dwukrotnie, aby otworzyć widok kodu formularza.Aby uprościć dostęp do
DllImport, dodaj polecenieImportsna początku kodu dla klasy formularza startowego:Imports System.Runtime.InteropServicesZadeklaruj pustą funkcję poprzedzającą instrukcję
End Classformularza i nadaj funkcjiMoveFilenazwę .Zastosuj modyfikatory
PublicorazShareddo deklaracji funkcji i ustaw parametry dlaMoveFilena 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 FunctionFunkcja może mieć dowolną prawidłową nazwę procedury; atrybut
DllImportokreś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.DllImportZastosuj 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 atrybutDllImportwymusza przekazywanie wywołańMoveFiledoMoveFileWw KERNEL32.DLL. MetodaMoveFileWkopiuje plik ze ścieżkisrcdo ś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 FunctionDodaj 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 SubUtwó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 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".