Návod: Volání rozhraní API systému Windows (Visual Basic)
Rozhraní API systému Windows jsou dynamické knihovny (DLL), které jsou součástí operačního systému Windows. Můžete je použít k provádění úkolů, když je obtížné psát ekvivalentní procedury vlastní. Například Systém Windows poskytuje funkci s názvem FlashWindowEx
, která umožňuje vytvořit záhlaví aplikace, která se může střídat mezi světlými a tmavými odstíny.
Výhodou použití rozhraní API systému Windows ve vašem kódu je, že můžou ušetřit čas vývoje, protože obsahují desítky užitečných funkcí, které jsou už napsané a čekají na použití. Nevýhodou je, že rozhraní API systému Windows může být obtížné pracovat s rozhraními API a zrušit jejich zrušení, když se něco pokazí.
Rozhraní API systému Windows představují zvláštní kategorii interoperability. Rozhraní API systému Windows nepoužívají spravovaný kód, nemají integrované knihovny typů a používají datové typy, které se liší od datových typů používaných v sadě Visual Studio. Vzhledem k těmto rozdílům a vzhledem k tomu, že rozhraní API systému Windows nejsou objekty COM, provádí se interoperabilita s rozhraními API systému Windows a rozhraní .NET Framework se provádí pomocí volání platformy nebo PInvoke. Volání platformy je služba, která umožňuje spravovanému kódu volat nespravované funkce implementované v knihovnách DLL. Další informace naleznete v tématu Využívání nespravovaných funkcí knihovny DLL. PInvoke v jazyce Visual Basic můžete použít buď pomocí Declare
příkazu, nebo použití atributu DllImport
na prázdnou proceduru.
Volání rozhraní API systému Windows byla důležitou součástí programování v jazyce Visual Basic v minulosti, ale v jazyce Visual Basic .NET jsou zřídka nezbytná. Kdykoli je to možné, měli byste k provádění úloh místo volání rozhraní API systému Windows použít spravovaný kód z rozhraní .NET Framework. Tento názorný postup poskytuje informace pro situace, kdy je nutné používat rozhraní API systému Windows.
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í.
Volání rozhraní API s využitím deklarace
Nejběžnějším způsobem volání rozhraní API systému Windows je použití příkazu Declare
.
Deklarujte proceduru knihovny DLL.
Určete název funkce, kterou chcete volat, plus 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 systému Windows najdete v dokumentaci k sadě Win32 SDK v rozhraní WINDOWS API sady Platform SDK. Další informace o konstantách, které používají rozhraní API systému Windows, najdete v hlavičkových souborech, jako je Například Windows.h, které jsou součástí sady SDK platformy.
Otevřete nový projekt aplikace systému Windows kliknutím na tlačítko Nový v nabídce Soubor a poté klepněte na příkaz Projekt. Zobrazí se dialogové okno Nový projekt.
Ze seznamu šablon projektů jazyka Visual Basic vyberte aplikaci systému Windows. Zobrazí se nový projekt.
Do třídy nebo modulu, ve kterém chcete použít knihovnu DLL, přidejte následující
Declare
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
Auto
Modifikátor dává modulu runtime pokyn k převodu řetězce na základě názvu metody podle pravidel modulu CLR (nebo názvu aliasu, pokud je zadán).
Klíčová slova Lib a Alias
Název za Function
klíčovým slovem je název, který váš program používá pro přístup k importované funkci. Může to být stejné jako skutečný název funkce, kterou voláte, nebo můžete použít libovolný platný název procedury a potom použít Alias
klíčové slovo k určení skutečného názvu funkce, kterou voláte.
Lib
Zadejte klíčové slovo následované názvem a umístěním knihovny DLL, která obsahuje funkci, kterou voláte. Nemusíte zadávat cestu k souborům umístěným v systémových adresářích Systému Windows.
Alias
Klíčové slovo použijte, pokud název funkce, kterou voláte, není platný název procedury jazyka Visual Basic nebo je v konfliktu s názvem jiných položek ve vaší aplikaci. Alias
označuje skutečný název volané funkce.
Deklarace argumentů a datových typů
Deklarujte argumenty a jejich datové typy. Tato část může být náročná, protože datové typy, které Systém Windows používá, neodpovídají datovým typům sady Visual Studio. Visual Basic za vás hodně pracuje převodem argumentů na kompatibilní datové typy, procesu označovaného jako zařazování. Způsob zařazování argumentů můžete explicitně řídit pomocí atributu MarshalAsAttribute definovaného System.Runtime.InteropServices v oboru názvů.
Poznámka:
Předchozí verze jazyka Visual Basic umožňují deklarovat parametry As Any
, což znamená, že lze použít data libovolného datového typu. Jazyk Visual Basic vyžaduje, abyste pro všechny Declare
příkazy použili konkrétní datový typ.
Konstanty rozhraní API systému Windows
Některé argumenty jsou kombinace konstant. Například rozhraní API zobrazené v tomto názorném postupu přijímá celočíselnou hodnotu, Typ
která určuje způsob MessageBox
zobrazení pole se zprávou. Číselnou hodnotu těchto konstant můžete určit prozkoumáním #define
příkazů v souboru WinUser.h. Číselné hodnoty jsou obecně zobrazeny v šestnáctkové soustavě, takže je můžete chtít použít k jejich přidání a převodu na desetinné číslo. Pokud chcete například zkombinovat konstanty pro vykřičník MB_ICONEXCLAMATION
0x00000030 a 0x00000004 stylu MB_YESNO
Ano/Ne, můžete sčítat čísla a získat výsledek 0x00000034 nebo 52 desetinných míst. I když můžete použít výsledek desetinné čárky přímo, je lepší deklarovat tyto hodnoty jako konstanty v aplikaci a kombinovat je pomocí operátoru Or
.
Deklarace konstant pro volání rozhraní API systému Windows
Projděte si dokumentaci k funkci Windows, kterou voláte. Určete název konstant, které používá, a název souboru .h, který obsahuje číselné hodnoty těchto konstant.
K zobrazení obsahu souboru záhlaví (.h) použijte textový editor, například Poznámkový blok, a vyhledejte hodnoty spojené s konstantami, které používáte.
MessageBox
Například rozhraní API používá konstantuMB_ICONQUESTION
k zobrazení otazníku v poli se zprávou. DefiniceMB_ICONQUESTION
je ve WinUser.h a vypadá takto:#define MB_ICONQUESTION 0x00000020L
Přidáním ekvivalentních
Const
příkazů do třídy nebo modulu zpřístupníte tyto konstanty pro vaši aplikaci. Pří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
Button1
do spouštěcího formuláře projektu a potom poklikáním zobrazte jeho kód. Zobrazí se obslužná rutina události tlačítka.Přidejte kód do
Click
obslužné rutiny události pro tlačítko, které jste přidali, pro volání procedury a zadání 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 Sub
Spusťte projekt stisknutím klávesy F5. Okno se zprávou se zobrazí s tlačítky odpovědi Ano i Ne . Klikněte na některý z nich.
Přiřazování dat
Visual Basic automaticky převede datové typy parametrů a návratové hodnoty pro volání rozhraní API systému Windows, ale atribut můžete použít MarshalAs
k explicitnímu určení nespravovaných datových typů, které rozhraní API očekává. Další informace o zařazování zprostředkovatele komunikace najdete v tématu Zařazování zprostředkovatele komunikace.
Použití deklarací a zařazování jako volání rozhraní API
Určete název funkce, kterou chcete volat, plus její argumenty, datové typy a návratovou hodnotu.
Pokud chcete zjednodušit přístup k atributu
MarshalAs
, přidejte příkazImports
na začátek kódu pro třídu nebo modul, jak je znázorněno v následujícím příkladu:Imports System.Runtime.InteropServices
Přidejte prototyp funkce pro importovanou funkci do třídy nebo modulu, který používáte, a použijte
MarshalAs
atribut na parametry nebo návratovou hodnotu. V následujícím příkladu se volání rozhraní API, které očekává typvoid*
, zařadí jakoAsAny
:Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" ( ByVal x As Short, <MarshalAsAttribute(UnmanagedType.AsAny)> ByVal o As Object)
Volání rozhraní API pomocí knihovny DllImport
Atribut DllImport
poskytuje druhý způsob volání funkcí v knihovnách DLL bez knihoven typů. DllImport
je zhruba ekvivalentní použití Declare
příkazu, ale poskytuje větší kontrolu nad tím, jak se funkce volají.
Většinu volání rozhraní WINDOWS API můžete použít DllImport
, pokud volání odkazuje na sdílenou metodu (někdy označovanou jako statická). Nelze použít metody, které vyžadují instanci třídy. Na rozdíl od Declare
příkazů DllImport
nemohou volání použít MarshalAs
atribut.
Volání rozhraní API systému Windows pomocí atributu DllImport
Otevřete nový projekt aplikace systému Windows kliknutím na tlačítko Nový v nabídce Soubor a poté klepněte na příkaz Projekt. Zobrazí se dialogové okno Nový projekt.
Ze seznamu šablon projektů jazyka Visual Basic vyberte aplikaci systému Windows. Zobrazí se nový projekt.
Přidejte tlačítko s názvem
Button2
do spouštěcího formuláře.Poklikáním
Button2
otevřete zobrazení kódu formuláře.Chcete-li zjednodušit přístup,
DllImport
přidejteImports
příkaz na začátek kódu třídy spouštěcího formuláře:Imports System.Runtime.InteropServices
Deklarujte prázdnou
End Class
funkci před příkazem formuláře a pojmenujte funkciMoveFile
.Public
Použijte aShared
modifikátory na deklaraci funkce a nastavte parametry naMoveFile
základě argumentů, které funkce rozhraní API systému Windows používá:Public Shared Function MoveFile( ByVal src As String, ByVal dst As String) As Boolean ' Leave the body of the function empty. End Function
Vaše funkce může mít libovolný platný název procedury;
DllImport
atribut určuje název v knihovně DLL. Zpracovává také zařazování interoperability pro parametry a návratové hodnoty, takže můžete zvolit datové typy sady Visual Studio, které jsou podobné datovým typům, které rozhraní API používá.DllImport
Použijte atribut na prázdnou funkci. Prvním parametrem je název a umístění knihovny DLL obsahující funkci, kterou voláte. Nemusíte zadávat cestu k souborům umístěným v systémových adresářích Systému Windows. Druhý parametr je pojmenovaný argument, který určuje název funkce v rozhraní API systému Windows. V tomto příkladuDllImport
atribut vynutí přesměrování voláníMoveFile
doMoveFileW
KERNEL32.DLL. MetodaMoveFileW
zkopíruje soubor z cestysrc
do cestydst
.<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
Přidejte kód do
Button2_Click
obsluž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 Sub
Vytvoř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".