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
Sharedpř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
OverridesOverridableNotOverridableklíčové slovo,,,MustOverride,ImplementsneboHandlesDeclare.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í
Aliasklauzule zadat pořadové číslo vstupního bodu v tabulce exportu externího souboru. K tomu je třeba začínataliasnameznakem čí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 StrictjeOn, je nutné zadat datový typ každého parametru vparameterlist. Může to být libovolný datový typ nebo název výčtu, struktury, třídy nebo rozhraní. V rámciparameterlistpoužijteAsklauzuli 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
Integerparametrem (16 bitů v Visual Basic 6,0), je nutné určit odpovídající argument jakoShortvDeclarepříkazu, protože to je 16bitový typ integer v Visual Basic. podobněLongmá odlišnou šířku dat v Visual Basic 6,0 aDateje implementována jinak.Návratový typ dat Pokud je externí procedura
Functiona, jeOption StrictOnnutné 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 StrictjeOffa neurčíte datový typ parametru vparameterlist, kompilátor Visual Basic převede odpovídající argument na datový typ objektu. Podobně pokud nezadátereturntype, kompilátor převezme návratový datový typObject.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í
FunctionSubhodnotu.Argumenty předáte externí proceduře přesně tak, jak je uvedeno
parameterlistvDeclarepří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 uvedenoreturntypevDeclarepříkazu .Znakové sady. Můžete určit, jak
charsetmodifiermá 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ůAnsiUnicodedo hodnot Unicode. Modifikátor směruje Visual Basic zařazování řetězců podle pravidel .NET Framework na základě externího odkazuAutoname, neboaliasnameje-li zadán. Výchozí hodnota jeAnsi.charsetmodifiertaké určuje, Visual Basic má externí procedura v rámci svého externího souboru hledat.Ansia oba Visual Basic, aby ji hledali bezeUnicodezmě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
DeclareDllImportAttribute 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