Declare – příkaz

Deklaruje odkaz na proceduru implementovanou v externím souboru.

Syntax

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _
Declare [ charsetmodifier ] [ Sub ] name Lib "libname" _
[ Alias "aliasname" ] [ ([ parameterlist ]) ]
' -or-
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _
Declare [ charsetmodifier ] [ Function ] name Lib "libname" _
[ Alias "aliasname" ] [ ([ parameterlist ]) ] [ As returntype ]

Součásti

Pojem Definice
attributelist Nepovinný parametr. Viz seznam atributů.
accessmodifier Nepovinný parametr. Může to být jedna z následujících:

- Republik
- Proti
- Friend
- Hlášen
- Chráněný přítel
- Soukromé chráněné

Podívejte se na úrovně přístupu v Visual Basic.
Shadows Nepovinný parametr. Viz Shadows.
charsetmodifier Nepovinný parametr. Určuje znakovou sadu a informace o hledání souborů. Může to být jedna z následujících:

- ANSI (výchozí)
- Sady
- Automaticky
Sub Volitelné, ale Sub Function musí být buď nebo. Indikuje, že externí procedura nevrací hodnotu.
Function Volitelné, ale Sub Function musí být buď nebo. Označuje, že externí procedura vrací hodnotu.
name Povinná hodnota. Název tohoto externího odkazu Další informace naleznete v tématu deklarované názvy elementů.
Lib Povinná hodnota. Zavádí Lib klauzuli, která identifikuje externí soubor (DLL nebo prostředek kódu) obsahující externí proceduru.
libname Povinná hodnota. Název souboru, který obsahuje deklarovanou proceduru.
Alias Nepovinný parametr. Označuje, že procedura, kterou deklarujete, nemůže být v rámci svého souboru identifikována názvem zadaným v name . Určíte jeho identifikaci v aliasname .
aliasname Vyžaduje se, pokud použijete Alias klíčové slovo. Řetězec, který identifikuje proceduru jedním ze dvou způsobů:

Název vstupního bodu procedury v rámci jeho souboru v uvozovkách ( "" )

-nebo-

Znak čísla ( # ) následovaný celým číslem udávajícím pořadové číslo vstupního bodu procedury v rámci jeho souboru
parameterlist Vyžaduje se, pokud procedura převezme parametry. Viz seznam parametrů.
returntype Požadováno Function , pokud je zadáno a Option Strict je On . Datový typ hodnoty vrácené procedurou

Poznámky

Někdy je nutné volat proceduru definovanou v souboru (například knihovna DLL nebo prostředek kódu) mimo váš projekt. pokud to uděláte, kompilátor Visual Basic nemá přístup k informacím, které potřebuje k správnému volání procedury, jako je například kde je procedura umístěna, jak je identifikována, její volající sekvence a návratový typ a znaková sada, kterou používá. DeclarePříkaz vytvoří odkaz na externí proceduru a poskytne tyto nezbytné informace.

Můžete použít Declare pouze na úrovni modulu. To znamená, že kontext deklarace pro externí odkaz musí být třída, struktura nebo modul a nemůže se jednat o zdrojový soubor, obor názvů, rozhraní, proceduru nebo blok. Další informace najdete v tématu deklarace kontextů a výchozích úrovní přístupu.

Externí odkazy jsou výchozí pro veřejný přístup. Můžete upravit jejich úrovně přístupu modifikátory přístupu.

Pravidla

  • Atribut. Můžete použít atributy na externí odkaz. Libovolný atribut, který použijete, má vliv pouze na projekt, nikoli v externím souboru.

  • Modifikátory. Externí procedury jsou implicitně sdíleny. Klíčové slovo nelze použít Shared při deklaraci externího odkazu a nelze změnit jeho sdílený stav.

    Externí procedura se nemůže zúčastnit přepsání, implementace členů rozhraní nebo zpracování událostí. V příkazu proto nelze použít Overrides Overridable NotOverridable klíčové slovo,,, MustOverride , Implements nebo Handles Declare .

  • Název externí procedury Tento externí odkaz není nutné zadávat na stejný název (v name ) jako název vstupního bodu procedury v jeho externím souboru ( aliasname ). AliasK určení názvu vstupního bodu můžete použít klauzuli. to může být užitečné v případě, že externí procedura má stejný název jako Visual Basic rezervovaný modifikátor nebo proměnná, procedura nebo jakýkoli jiný programový prvek ve stejném oboru.

    Poznámka

    Názvy vstupních bodů ve většině knihoven DLL rozlišují velká a malá písmena.

  • Externí číslo procedury Alternativně můžete pomocí Alias klauzule zadat pořadové číslo vstupního bodu v tabulce exportu externího souboru. K tomu je třeba začínat aliasname znakem čísla ( # ). to může být užitečné, pokud libovolný znak v názvu externí procedury není povolen v Visual Basic, nebo pokud externí soubor exportuje proceduru bez názvu.

Pravidla datového typu

  • Datové typy parametrů. Pokud Option Strict je On , je nutné zadat datový typ každého parametru v parameterlist . Může to být libovolný datový typ nebo název výčtu, struktury, třídy nebo rozhraní. V rámci parameterlist použijte As klauzuli k určení datového typu argumentu, který má být předán každému parametru.

    Poznámka

    pokud externí procedura nebyla zapsána pro .NET Framework, je nutné dbát na to, aby datové typy odpovídaly. například pokud deklarujete externí odkaz na Visual Basic 6,0 s Integer parametrem (16 bitů v Visual Basic 6,0), je nutné určit odpovídající argument jako Short v Declare příkazu, protože to je 16bitový typ integer v Visual Basic. podobně Long má odlišnou šířku dat v Visual Basic 6,0 a Date je implementována jinak.

  • Návratový typ dat Pokud je externí procedura Function a, je Option Strict On nutné zadat datový typ hodnoty vrácené volajícímu kódu. Může to být libovolný datový typ nebo název výčtu, struktury, třídy nebo rozhraní.

    Poznámka

    kompilátor Visual Basic neověřuje, zda jsou datové typy kompatibilní s externí procedurou. Pokud dojde k neshodě, modul CLR (Common Language Runtime) vygeneruje MarshalDirectiveException v době běhu výjimku.

  • Výchozí datové typy. pokud Option Strict je Off a neurčíte datový typ parametru v parameterlist , kompilátor Visual Basic převede odpovídající argument na datový typ objektu. Podobně pokud nezadáte returntype , kompilátor převezme návratový datový typ Object .

    Poznámka

    Vzhledem k tomu, že pracujete s externí procedurou, která mohla být napsána na jiné platformě, je nebezpečné dělat jakékoli předpoklady týkající se datových typů nebo jim umožnit jejich výchozí nastavení. Je mnohem bezpečnější zadat datový typ každého parametru a vrácenou hodnotu, pokud existuje. Tím se také zlepšuje čitelnost kódu.

Chování

  • Oboru. Externí odkaz je v rozsahu v rámci své třídy, struktury nebo modulu.

  • Platné. Externí odkaz má stejnou životnost jako třída, struktura nebo modul, ve kterém je deklarován.

  • Volání externí procedury. Externí proceduru voláte stejným způsobem jako proceduru nebo – tak, že ji používáte ve výrazu, pokud vrací hodnotu, nebo ji zadáte v příkazu Call, pokud nevrací Function Sub hodnotu.

    Argumenty předáte externí proceduře přesně tak, jak je uvedeno parameterlist v Declare příkazu . Nevezměte v úvahu, jak byly parametry původně deklarovány v externím souboru. Podobně pokud existuje návratová hodnota, použijte ji přesně tak, jak je uvedeno returntype v Declare příkazu .

  • Znakové sady. Můžete určit, jak charsetmodifier má Visual Basic zařazování řetězců při volání externí procedury. Modifikátor iniciuje Visual Basic zařazování všech řetězců do hodnot ANSI a modifikátor ji přesměruje tak, aby zařazování všech řetězců Ansi Unicode do hodnot Unicode. Modifikátor směruje Visual Basic zařazování řetězců podle pravidel .NET Framework na základě externího odkazu Auto name , nebo aliasname je-li zadán. Výchozí hodnota je Ansi.

    charsetmodifiertaké určuje, Visual Basic má externí procedura v rámci svého externího souboru hledat. Ansia oba Visual Basic, aby ji hledali beze Unicode změny názvu během hledání. Autonasměruje Visual Basic určit základní znakovou sadu platformy za běhu a případně upravit název externí procedury následujícím způsobem:

    • Na platformě Unicode, jako je Windows, nejprve vyhledejte externí proceduru beze změny názvu. Pokud dojde k selhání, připojte na konec názvu externí procedury "W" a znovu ho vyhledejte.

    • Na platformě ANSI nejprve vyhledejte externí proceduru beze změny názvu. Pokud dojde k selhání, připojte na konec názvu externí procedury "A" a znovu ho vyhledejte.

  • Mechanismus. Visual Basic k řešení a přístupu k externím postupům používá mechanismus volání platformy .NET Framework (PInvoke). Příkaz i třída používají tento mechanismus automaticky a nepotřebujete žádné informace Declare DllImportAttribute o PInvoke. Další informace najdete v tématu Návod: Volání Windows API.

Důležité

Pokud externí procedura běží mimo modul CLR (Common Language Runtime), jedná se o nespravovaný kód. Při volání takové procedury, například pomocí Windows API nebo metody MODELU COM, můžete svou aplikaci vystavit rizikům zabezpečení. Další informace najdete v tématu Pokyny pro bezpečné kódování pro nespravovaný kód.

Příklad 1

Následující příklad deklaruje externí odkaz na Function proceduru, která vrací aktuální uživatelské jméno. Potom volá externí GetUserNameA proceduru jako součást getUser procedury.

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (
    ByVal lpBuffer As String, ByRef nSize As Integer) As Integer
Sub GetUser()
    Dim buffer As String = New String(CChar(" "), 25)
    Dim retVal As Integer = GetUserName(buffer, 25)
    Dim userName As String = Strings.Left(buffer, InStr(buffer, Chr(0)) - 1)
    MsgBox(userName)
End Sub

Příklad 2

poskytuje DllImportAttribute alternativní způsob použití funkcí v nespravovaném kódu. Následující příklad deklaruje importované funkce bez použití Declare příkazu .

' Add an Imports statement at the top of the class, structure, or
' module that uses the DllImport attribute.
Imports System.Runtime.InteropServices
<DllImportAttribute("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
    ' This function copies a file from the path src to the path dst.
    ' Leave this function empty. The DLLImport attribute forces calls
    ' to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL.
End Function

Viz také