Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Rozhraní API systému Windows jsou knihovny dynamického propojení (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 a jsou neúprosné, 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 skutečnosti, že rozhraní API systému Windows nejsou objekty COM, se interoperabilita s rozhraními API systému Windows a rozhraním .NET Framework provádí pomocí platformového vyvolání, nebo PInvoke. PInvoke 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:
Počítač může v následujících pokynech zobrazit různé názvy nebo umístění některých prvků uživatelského rozhraní sady Visual Studio. Edice sady Visual Studio, kterou máte, a nastavení, která používáte, určují tyto prvky. Další informace najdete v tématu Přizpůsobeníintegrovaného vývojového prostředí (IDE).
Volání API pomocí 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á běhovému prostředí pokyn k převodu řetězce na základě názvu metody podle pravidel běhového prostředí 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í. Můžete přesně řídit způsob zařazování argumentů pomocí atributu MarshalAsAttribute definovaného v oboru názvů System.Runtime.InteropServices.
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 MessageBox
API zobrazené v tomto názorném postupu přijímá celočíselný argument Typ
, který určuje způsob 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 možná budete chtít použít kalkulačku k jejich sečtení a převodu na desítkovou soustavu. Pokud chcete například zkombinovat konstanty pro vykřičníkový styl MB_ICONEXCLAMATION
0x00000030 a styl Ano/Ne MB_YESNO
0x00000004, můžete sčítat čísla a získat výsledek 0x00000034 nebo 52 desítkově. 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 přidružené k konstantám, 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. 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
Button1
do spouštěcího formuláře projektu a potom poklikáním zobrazte jeho kód. Obslužná rutina události pro tlačítko se zobrazí.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.
Sběr a organizace 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 marshallování pro interoperabilitu najdete v tématu Interop Marshaling.
K použití atributu Declare a MarshalAs při 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ů nemohou DllImport
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 k
DllImport
, přidejteImports
příkaz na začátek kódu třídy formuláře pro spuštění:Imports System.Runtime.InteropServices
Deklarujte prázdnou
End Class
funkci před příkazem formuláře a pojmenujte funkciMoveFile
.Použijte modifikátory
Public
aShared
na deklaraci funkce a nastavte parametry proMoveFile
na 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říkladu atributDllImport
nutí, aby se voláníMoveFile
přesměrovala naMoveFileW
v 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".