Návod: Volání rozhraní API systému Windows (Visual Basic)
Windows Rozhraní API jsou dynamické knihovny (DLL), které jsou součástí Windows systému. Můžete je použít k provádění úloh, když je obtížné napsat vlastní ekvivalentní postupy. Například Windows funkci s názvem , která umožňuje, aby záhlaví aplikace střídalo světlé a FlashWindowEx tmavé odstíny.
Výhodou použití Windows API v kódu je, že mohou ušetřit čas při vývoji, protože obsahují desítky užitečných funkcí, které jsou už napsány a čekají na použití. Nevýhodou je, že Windows rozhraní API může být obtížné pracovat s rozhraními API a odpouštět, když se něco nepokazí.
Windows Rozhraní API představují zvláštní kategorii interoperability. Windows Rozhraní API nepoužívejte spravovaný kód, nemají integrované knihovny typů a používají datové typy, které se liší od datových typů používaných s Visual Studio. Vzhledem k těmto rozdílům a vzhledem k tomu, že rozhraní Windows API nejsou objekty COM, interoperabilita s rozhraními Windows API a rozhraní .NET Framework se provádí pomocí vyvolání platformy nebo PInvoke. Vyvolání platformy je služba, která umožňuje spravovanému kódu volat nespravované funkce implementované v knihovnách DLL. Další informace najdete v tématu Využívání funkcí nespravovaných knihoven DLL. PInvoke můžete použít Visual Basic příkazu nebo použitím atributu Declare DllImport na prázdnou proceduru.
Windows Volání rozhraní API byla v minulosti Visual Basic důležitou součástí programování, ale s rozhraním .NET Visual Basic jen zřídka. Kdykoli je to možné, měli byste k provádění úloh .NET Framework spravovaný kód z Windows rozhraní API. Tento názorný postup poskytuje informace pro situace, kdy je Windows rozhraní API.
Poznámka
Váš počítač může v následujících pokynech zobrazovat odlišné názvy nebo umístění některých prvků uživatelského rozhraní sady Visual Studio. Tyto prvky jsou určeny edicí sady Visual Studio a použitým nastavením. Další informace najdete v tématu Přizpůsobení integrovaného vývojového prostředí (IDE).
Volání rozhraní API pomocí deklarace
Nejběžnější způsob volání rozhraní API Windows je pomocí Declare příkazu .
Deklarace procedury knihovny DLL
Určete název funkce, kterou chcete volat, a její argumenty, typy argumentů a návratovou hodnotu a také název a umístění knihovny DLL, která ji obsahuje.
Poznámka
Úplné informace o rozhraních API Windows najdete v dokumentaci k sadě Win32 SDK v tématu Rozhraní API Windows Platform SDK. Další informace o konstantách, které Windows rozhraní API, najdete v souborech hlaviček, jako je Windows.h, které jsou součástí sady Platform SDK.
Otevřete nový projekt Windows kliknutím na Nový v nabídce Soubor a potom kliknutím na Project. Zobrazí se dialogové okno Nový projekt.
Ze Windows šablon projektů vyberte Visual Basic aplikace. Zobrazí se nový projekt.
Do třídy nebo modulu, ve kterém chcete použít
Declareknihovnu DLL, přidejte následující funkci: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
Části příkazu Declare
Příkaz Declare obsahuje následující prvky.
Automatický modifikátor
Modifikátor instruuje modul runtime, aby převést řetězec na základě názvu metody podle pravidel modulu Auto CLR (Common Language Runtime) (nebo názvu aliasu, pokud je zadaný).
Klíčová slova Lib a Alias
Název následující za klíčovým Function slovem je název, který program používá pro přístup k importované funkci. Může být stejný jako skutečný název funkce, kterou voláte, nebo můžete použít libovolný platný název procedury a pak použít klíčové slovo k určení skutečného názvu Alias volané funkce.
Zadejte klíčové slovo následované názvem a umístěním knihovny DLL, která Lib obsahuje funkci, kterou voláte. Není nutné zazadat cestu k souborům umístěným v adresářích Windows adresářů systému.
Klíčové slovo použijte, pokud název volané funkce není platný Visual Basic procedury nebo je v konfliktu s názvem jiných položek Alias ve vaší aplikaci. Alias označuje skutečný název volána funkce.
Deklarace argumentu a datového typu
Deklarujte argumenty a jejich datové typy. Tato část může být náročná, protože datové typy, Windows používá, neodpovídají Visual Studio datovým typům. Visual Basic za vás hodně práce převodem argumentů na kompatibilní datové typy, proces s názvem zařazování. Způsob zařazování argumentů můžete explicitně řídit pomocí MarshalAsAttribute atributu definovaného v oboru System.Runtime.InteropServices názvů .
Poznámka
Předchozí verze Visual Basic vám umožnily deklarovat parametry , což znamená, že je možné použít As Any data libovolného datového typu. Visual Basic vyžaduje použití konkrétního datového typu pro všechny Declare příkazy.
Windows Konstanty rozhraní API
Některé argumenty jsou kombinace konstant. Například rozhraní API zobrazené v tomto názorném postupu přijímá celočíselný argument s názvem , který řídí způsob zobrazení MessageBox Typ pole se zprávou. Číselnou hodnotu těchto konstant můžete určit prozkoumáním příkazů #define v souboru WinUser.h. Číselné hodnoty se obvykle zobrazují v šestnáctkové soustavě, takže je můžete přidat pomocí kalkulačky a převést na desetinné číslo. Pokud například chcete kombinovat konstanty stylu vykřičník 0x00000030 a styl Ano/Ne 0x00000004, můžete čísla přidat a získat výsledek 0x00000034 MB_ICONEXCLAMATION MB_YESNO nebo 52 desetinných míst. I když lze desetinný výsledek použít přímo, je lepší deklarovat tyto hodnoty jako konstanty v aplikaci a kombinovat je pomocí Or operátoru .
Deklarace konstant pro Windows rozhraní API
Informace o volané Windows najdete v dokumentaci. Určete název konstant, které používá, a název souboru .h, který obsahuje číselné hodnoty pro tyto konstanty.
Pomocí textového editoru, například Poznámkový blok, zobrazte obsah souboru záhlaví (.h) a vyhledejte hodnoty přidružené konstantám, které používáte. Například rozhraní
MessageBoxAPI používá konstantuMB_ICONQUESTIONk zobrazení otazník v okně se zprávou. Definice pro seMB_ICONQUESTIONnachází v souboru WinUser.h a zobrazuje se takto:#define MB_ICONQUESTION 0x00000020LPřidejte ekvivalentní příkazy do třídy nebo modulu, aby
Constbyly tyto konstanty dostupné pro vaši aplikaci. Například:Const MB_ICONQUESTION As Integer = &H20 Const MB_YESNO As Integer = &H4 Const IDYES As Integer = 6 Const IDNO As Integer = 7
Volání procedury knihovny DLL
Přidejte tlačítko s názvem do spouštěcího formuláře projektu a poklikejte na něj,
Button1abyste si prohlédněte jeho kód. Zobrazí se obslužná rutina události pro tlačítko.Přidejte kód do obslužné rutiny události pro
Clicktlačítko, které jste přidali, pro volání procedury a poskytnutí příslušných argumentů: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 SubStisknutím klávesy F5 spusťte projekt. Okno se zprávou se zobrazí s tlačítky Odpověď Ano i Ne. Klikněte na některý z nich.
Zařazování dat
Visual Basic automaticky převádí datové typy parametrů Windows návratových hodnot pro volání rozhraní API, ale pomocí atributu můžete explicitně určit nespravované datové typy, které rozhraní MarshalAs API očekává. Další informace o zařazování interop marshaling tématu Zařazování spolupráce.
Použití funkcí Declare a MarshalAs ve volání rozhraní API
Určete název funkce, kterou chcete volat, a její argumenty, datové typy a návratovou hodnotu.
Pro zjednodušení přístupu k atributu přidejte na začátek kódu pro třídu nebo modul příkaz
MarshalAsImportsjako v následujícím příkladu:Imports System.Runtime.InteropServicesPřidejte prototyp funkce pro importované funkce do třídy nebo modulu, který používáte, a použijte atribut na
MarshalAsparametry nebo návratovou hodnotu. V následujícím příkladu je zařazování volání rozhraní API, které očekávávoid*typAsAny:Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" ( ByVal x As Short, <MarshalAsAttribute(UnmanagedType.AsAny)> ByVal o As Object)
Volání rozhraní API pomocí DllImport
Atribut DllImport poskytuje druhý způsob volání funkcí v knihovnách DLL bez knihoven typů. DllImport je zhruba ekvivalentní použití příkazu , ale poskytuje Declare větší kontrolu nad tím, jak se funkce volána.
Můžete použít s většinou Windows rozhraní API, pokud volání odkazuje na sdílenou DllImport (někdy nazývanou statickou) metodu . Nelze použít metody, které vyžadují instanci třídy. Na Declare rozdíl od příkazů volání nemohou používat atribut DllImport MarshalAs .
Volání rozhraní API Windows atributem DllImport
Otevřete nový projekt Windows kliknutím na Nový v nabídce Soubor a potom kliknutím na Project. Zobrazí se dialogové okno Nový projekt.
Ze Windows šablon projektů vyberte Visual Basic aplikace. Zobrazí se nový projekt.
Do formuláře pro spuštění
Button2přidejte tlačítko s názvem .Dvojím kliknutím
Button2otevřete zobrazení kódu formuláře.Pro zjednodušení přístupu k přidejte na začátek kódu pro třídu
DllImportformuláře pro spuštění příkazImports:Imports System.Runtime.InteropServicesDeklarujte prázdnou funkci před příkazem formuláře a
End Classpojmete funkciMoveFile.Použijte modifikátory a na deklaraci funkce a nastavte parametry pro na základě
Publicargumentů, Windows rozhraní APISharedMoveFilepoužívá:Public Shared Function MoveFile( ByVal src As String, ByVal dst As String) As Boolean ' Leave the body of the function empty. End FunctionVaše funkce může mít libovolný platný název procedury. Atribut
DllImporturčuje název v knihovně DLL. Zpracovává také zařazování interoperability pro parametry a návratové hodnoty, takže můžete zvolit Visual Studio datové typy, které jsou podobné datovým typům, které rozhraní API používá.Použijte
DllImportatribut na prázdnou funkci. Prvním parametrem je název a umístění knihovny DLL obsahující funkci, kterou voláte. Není nutné zazadat cestu k souborům umístěným v adresářích Windows adresářů systému. Druhý parametr je pojmenovaný argument, který určuje název funkce v rozhraní WINDOWS API. V tomto příkladu atribut vynutí předání volání do vDllImportMoveFileMoveFileWKERNEL32.DLL. MetodaMoveFileWzkopíruje soubor z cesty k cestěsrcdst.<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 FunctionPřidejte kód do
Button2_Clickobslužné rutiny události pro volání funkce: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 SubVytvořte soubor s názvem Test.txt a umístěte ho do adresáře C:\Tmp na pevný disk. V případě potřeby vytvořte adresář Tmp.
Stisknutím klávesy F5 spusťte aplikaci. Zobrazí se hlavní formulář.
Klikněte na Tlačítko2. Pokud je možné soubor přesunout, zobrazí se zpráva "Soubor byl úspěšně přesunut".