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í
Declarefunkci: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.
MessageBoxNapříklad rozhraní API používá konstantuMB_ICONQUESTIONk zobrazení otazníku v poli se zprávou. DefiniceMB_ICONQUESTIONje ve WinUser.h a vypadá takto:#define MB_ICONQUESTION 0x00000020LPřidáním ekvivalentních
Constpří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
Button1do 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
Clickobsluž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 SubSpusť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říkazImportsna začátek kódu pro třídu nebo modul, jak je znázorněno v následujícím příkladu:Imports System.Runtime.InteropServicesPřidejte prototyp funkce pro importovanou funkci do třídy nebo modulu, který používáte, a použijte
MarshalAsatribut 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
Button2do spouštěcího formuláře.Poklikáním
Button2otevřete zobrazení kódu formuláře.Chcete-li zjednodušit přístup k
DllImport, přidejteImportspříkaz na začátek kódu třídy formuláře pro spuštění:Imports System.Runtime.InteropServicesDeklarujte prázdnou
End Classfunkci před příkazem formuláře a pojmenujte funkciMoveFile.Použijte modifikátory
PublicaSharedna deklaraci funkce a nastavte parametry proMoveFilena 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 FunctionVaše funkce může mít libovolný platný název procedury;
DllImportatribut 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á.DllImportPouž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 atributDllImportnutí, aby se voláníMoveFilepřesměrovala naMoveFileWv KERNEL32.DLL. MetodaMoveFileWzkopíruje soubor z cestysrcdo 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 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".