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

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

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

  3. Ze Windows šablon projektů vyberte Visual Basic aplikace. Zobrazí se nový projekt.

  4. Do třídy nebo modulu, ve kterém chcete použít Declare knihovnu 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
  1. 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.

  2. 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í MessageBox API používá konstantu MB_ICONQUESTION k zobrazení otazník v okně se zprávou. Definice pro se MB_ICONQUESTION nachází v souboru WinUser.h a zobrazuje se takto:

    #define MB_ICONQUESTION 0x00000020L

  3. Přidejte ekvivalentní příkazy do třídy nebo modulu, aby Const byly 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
  1. Přidejte tlačítko s názvem do spouštěcího formuláře projektu a poklikejte na něj, Button1 abyste si prohlédněte jeho kód. Zobrazí se obslužná rutina události pro tlačítko.

  2. Přidejte kód do obslužné rutiny události pro Click tlačí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 Sub
    
  3. Stisknutí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
  1. Určete název funkce, kterou chcete volat, a její argumenty, datové typy a návratovou hodnotu.

  2. Pro zjednodušení přístupu k atributu přidejte na začátek kódu pro třídu nebo modul příkaz MarshalAs Imports jako v následujícím příkladu:

    Imports System.Runtime.InteropServices
    
  3. Přidejte prototyp funkce pro importované funkce do třídy nebo modulu, který používáte, a použijte atribut na MarshalAs parametry nebo návratovou hodnotu. V následujícím příkladu je zařazování volání rozhraní API, které očekává void* typ AsAny :

    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

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

  2. Ze Windows šablon projektů vyberte Visual Basic aplikace. Zobrazí se nový projekt.

  3. Do formuláře pro spuštění Button2 přidejte tlačítko s názvem .

  4. Dvojím kliknutím Button2 otevřete zobrazení kódu formuláře.

  5. Pro zjednodušení přístupu k přidejte na začátek kódu pro třídu DllImport formuláře pro spuštění příkaz Imports :

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

  7. Použijte modifikátory a na deklaraci funkce a nastavte parametry pro na základě Public argumentů, Windows rozhraní API Shared MoveFile 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. Atribut DllImport 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 Visual Studio datové typy, které jsou podobné datovým typům, které rozhraní API používá.

  8. Použijte DllImport atribut 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 v DllImport MoveFile MoveFileW KERNEL32.DLL. Metoda MoveFileW zkopíruje soubor z cesty k cestě src 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é