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.

  1. 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.

  2. 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.

  3. Ze seznamu šablon projektů jazyka Visual Basic vyberte aplikaci systému Windows. Zobrazí se nový projekt.

  4. 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
  1. 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.

  2. 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á konstantu MB_ICONQUESTION k zobrazení otazníku v poli se zprávou. Definice MB_ICONQUESTION je ve WinUser.h a vypadá takto:

    #define MB_ICONQUESTION 0x00000020L

  3. 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
  1. 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.

  2. 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
    
  3. 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
  1. Určete název funkce, kterou chcete volat, plus její argumenty, datové typy a návratovou hodnotu.

  2. Pokud chcete zjednodušit přístup k atributu MarshalAs , přidejte příkaz Imports 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
    
  3. 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á typ void* , zařadí jako AsAny:

    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

  1. 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.

  2. Ze seznamu šablon projektů jazyka Visual Basic vyberte aplikaci systému Windows. Zobrazí se nový projekt.

  3. Přidejte tlačítko s názvem Button2 do spouštěcího formuláře.

  4. Poklikáním Button2 otevřete zobrazení kódu formuláře.

  5. Chcete-li zjednodušit přístup, DllImportpřidejte Imports příkaz na začátek kódu třídy spouštěcího formuláře:

    Imports System.Runtime.InteropServices
    
  6. Deklarujte prázdnou End Class funkci před příkazem formuláře a pojmenujte funkci MoveFile.

  7. Public Použijte a Shared modifikátory na deklaraci funkce a nastavte parametry na MoveFile 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á.

  8. 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 DllImport atribut vynutí přesměrování volání MoveFile do MoveFileW KERNEL32.DLL. Metoda MoveFileW zkopíruje soubor z cesty src do cesty dst.

    <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
    
  9. 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
    
  10. 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.

  11. Stisknutím klávesy F5 spusťte aplikaci. Zobrazí se hlavní formulář.

  12. Klikněte na tlačítko2. Pokud je možné soubor přesunout, zobrazí se zpráva "Soubor byl úspěšně přesunut".

Viz také