Instructie declareren
Declareert een verwijzing naar een procedure die is geïmplementeerd in een extern bestand.
Syntaxis
[ <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 ]
generator
Term | Definitie |
---|---|
attributelist |
Optioneel. Zie de lijst met kenmerken. |
accessmodifier |
Optioneel. Dit kan een van de volgende zijn: - Openbaar - Beschermd - Vriend - Privé - Beveiligde vriend - Privé beveiligd Zie Access-niveaus in Visual Basic. |
Shadows |
Optioneel. Zie schaduwen. |
charsetmodifier |
Optioneel. Hiermee geeft u tekenset en bestand zoeken informatie. Dit kan een van de volgende zijn: - Ansi (standaard) - Unicode - Auto |
Sub |
Optioneel, maar Sub wel of Function moet worden weergegeven. Geeft aan dat de externe procedure geen waarde retourneert. |
Function |
Optioneel, maar Sub wel of Function moet worden weergegeven. Geeft aan dat de externe procedure een waarde retourneert. |
name |
Vereist. Naam van deze externe verwijzing. Zie Gedeclareerde elementnamen voor meer informatie. |
Lib |
Vereist. Introduceert een Lib component, die het externe bestand (DLL of coderesource) identificeert dat een externe procedure bevat. |
libname |
Vereist. Naam van het bestand dat de gedeclareerde procedure bevat. |
Alias |
Optioneel. Geeft aan dat de procedure die wordt gedeclareerd, niet kan worden geïdentificeerd in het bestand door de naam die is opgegeven in name . U geeft de identificatie op in aliasname . |
aliasname |
Vereist als u het Alias trefwoord gebruikt. Tekenreeks die de procedure op twee manieren identificeert:De naam van het toegangspunt van de procedure binnen het bestand, tussen aanhalingstekens ( "" )– of – Een getalteken ( # ) gevolgd door een geheel getal dat het rangnummer van het toegangspunt van de procedure in het bestand aangeeft |
parameterlist |
Vereist als de procedure parameters gebruikt. Zie de lijst met parameters. |
returntype |
Vereist als Function is opgegeven en Option Strict is On . Gegevenstype van de waarde die door de procedure wordt geretourneerd. |
Opmerkingen
Soms moet u een procedure aanroepen die is gedefinieerd in een bestand (zoals een DLL of coderesource) buiten uw project. Wanneer u dit doet, heeft de Visual Basic-compiler geen toegang tot de informatie die nodig is om de procedure correct aan te roepen, zoals waar de procedure zich bevindt, hoe deze wordt geïdentificeerd, de aanroepende reeks en het retourtype en de tekenreekstekenset die wordt gebruikt. De Declare
instructie maakt een verwijzing naar een externe procedure en levert deze noodzakelijke informatie.
U kunt alleen op moduleniveau gebruiken Declare
. Dit betekent dat de declaratiecontext voor een externe verwijzing een klasse, structuur of module moet zijn en geen bronbestand, naamruimte, interface, procedure of blok mag zijn. Zie Declaratiecontexten en standaardtoegangsniveaus voor meer informatie.
Externe verwijzingen zijn standaard ingesteld op Openbare toegang. U kunt hun toegangsniveaus aanpassen met de toegangsaanpassingen.
Regels
Kenmerken. U kunt kenmerken toepassen op een externe verwijzing. Elk kenmerk dat u toepast, heeft alleen effect in uw project, niet in het externe bestand.
Modifiers. Externe procedures worden impliciet gedeeld. U kunt het trefwoord niet gebruiken bij het
Shared
declareren van een externe verwijzing en u kunt de gedeelde status ervan niet wijzigen.Een externe procedure kan niet deelnemen aan het overschrijven, implementeren van interfaceleden of het afhandelen van gebeurtenissen. Daarom kunt u de
Overrides
instructie ,Overridable
, ,NotOverridable
,MustOverride
, ofImplements
Handles
trefwoordDeclare
niet gebruiken.Naam van externe procedure. U hoeft deze externe verwijzing niet dezelfde naam (in
name
) te geven als de naam van het ingangspunt van de procedure in het externe bestand (aliasname
). U kunt eenAlias
component gebruiken om de naam van het toegangspunt op te geven. Dit kan handig zijn als de externe procedure dezelfde naam heeft als een gereserveerde wijzigingsfunctie voor Visual Basic of een variabele, procedure of een ander programmeerelement in hetzelfde bereik.Notitie
Namen van invoerpunten in de meeste DLL's zijn hoofdlettergevoelig.
Nummer van externe procedure. U kunt ook een
Alias
component gebruiken om het rangnummer van het toegangspunt in de exporttabel van het externe bestand op te geven. Hiervoor begintaliasname
u met een nummerteken (#
). Dit kan handig zijn als een teken in de naam van de externe procedure niet is toegestaan in Visual Basic of als het externe bestand de procedure zonder naam exporteert.
Regels voor gegevenstypen
Parametergegevenstypen. Als
Option Strict
dat het isOn
, moet u het gegevenstype van elke parameter opgeven inparameterlist
. Dit kan elk gegevenstype zijn of de naam van een opsomming, structuur, klasse of interface. Binnenparameterlist
gebruikt u eenAs
component om het gegevenstype van het argument op te geven dat aan elke parameter moet worden doorgegeven.Notitie
Als de externe procedure niet is geschreven voor .NET Framework, moet u ervoor zorgen dat de gegevenstypen overeenkomen. Als u bijvoorbeeld een externe verwijzing naar een Visual Basic 6.0-procedure declareert met een
Integer
parameter (16 bits in Visual Basic 6.0), moet u het bijbehorende argument identificeren zoalsShort
in deDeclare
instructie, omdat dat het 16-bits geheel getaltype is in Visual Basic. Heeft ookLong
een andere gegevensbreedte in Visual Basic 6.0 enDate
wordt anders geïmplementeerd.Gegevenstype retourneren. Als de externe procedure een
Function
enOption Strict
ander isOn
, moet u het gegevenstype opgeven van de waarde die wordt geretourneerd aan de aanroepende code. Dit kan elk gegevenstype zijn of de naam van een opsomming, structuur, klasse of interface.Notitie
De Visual Basic-compiler controleert niet of uw gegevenstypen compatibel zijn met die van de externe procedure. Als er sprake is van een niet-overeenkomende taalruntime, genereert de algemene taalruntime een MarshalDirectiveException uitzondering.
Standaardgegevenstypen. Als
Option Strict
dat het isOff
en u het gegevenstype van een parameter niet opgeeftparameterlist
, converteert de Visual Basic-compiler het bijbehorende argument naar het objectgegevenstype. Als u dit niet opgeeftreturntype
, neemt de compiler ook het retourgegevenstype.Object
Notitie
Omdat u te maken hebt met een externe procedure die mogelijk op een ander platform is geschreven, is het gevaarlijk om veronderstellingen over gegevenstypen uit te voeren of deze standaard toe te staan. Het is veel veiliger om het gegevenstype van elke parameter en van de retourwaarde op te geven, indien van toepassing. Dit verbetert ook de leesbaarheid van uw code.
Gedrag
Reikwijdte. Een externe verwijzing valt binnen het bereik van de klasse, structuur of module.
Levensduur. Een externe verwijzing heeft dezelfde levensduur als de klasse, structuur of module waarin deze wordt gedeclareerd.
Een externe procedure aanroepen. U roept een externe procedure op dezelfde manier aan als u een
Function
ofSub
procedure aanroept, door deze te gebruiken in een expressie als deze een waarde retourneert of door deze op te geven in een aanroepinstructie als deze geen waarde retourneert.U geeft argumenten door aan de externe procedure, precies zoals opgegeven
parameterlist
in deDeclare
instructie. Houd niet rekening met de manier waarop de parameters oorspronkelijk zijn gedeclareerd in het externe bestand. Als er ook een retourwaarde is, gebruikt u deze precies zoals opgegevenreturntype
in deDeclare
instructie.Tekensets. U kunt opgeven
charsetmodifier
hoe Visual Basic marshal strings moet gebruiken wanneer deze de externe procedure aanroept. DeAnsi
wijzigingsfunctie stuurt Visual Basic naar marshal alle tekenreeksen naar ANSI-waarden en deUnicode
wijzigingsfunctie stuurt deze door naar marshal alle tekenreeksen naar Unicode-waarden. DeAuto
wijzigingsfunctie stuurt Visual Basic naar marshal strings op basis van .NET Framework-regels op basis van de externe verwijzingname
, ofaliasname
indien opgegeven. De standaardwaarde isAnsi
.charsetmodifier
geeft ook op hoe Visual Basic de externe procedure in het externe bestand moet opzoeken.Ansi
enUnicode
beide direct Visual Basic om deze op te zoeken zonder de naam ervan te wijzigen tijdens de zoekopdracht.Auto
Stuurt Visual Basic om de basistekenset van het runtimeplatform te bepalen en mogelijk de naam van de externe procedure als volgt te wijzigen:Zoek op een Unicode-platform, zoals Windows, eerst de externe procedure op zonder naamwijziging. Als dat mislukt, voegt u 'W' toe aan het einde van de externe procedurenaam en zoekt u deze opnieuw op.
Zoek op een ANSI-platform eerst de externe procedure op zonder naamwijziging. Als dat mislukt, voegt u 'A' toe aan het einde van de externe procedurenaam en zoekt u deze opnieuw op.
Mechanisme. Visual Basic maakt gebruik van het mechanisme voor aanroepen van het .NET Framework-platform (PInvoke) om externe procedures op te lossen en te openen. De
Declare
instructie en de DllImportAttribute klasse gebruiken dit mechanisme automatisch en u hebt geen kennis van PInvoke nodig. Zie Walkthrough: Windows-API's aanroepen voor meer informatie.
Belangrijk
Als de externe procedure wordt uitgevoerd buiten de Common Language Runtime (CLR), is dit niet-beheerde code. Wanneer u een dergelijke procedure aanroept, bijvoorbeeld een Windows API-functie of een COM-methode, kunt u uw toepassing blootstellen aan beveiligingsrisico's. Zie Richtlijnen voor veilige codering voor niet-beheerde code voor meer informatie.
Voorbeeld 1
Het volgende voorbeeld declareert een externe verwijzing naar een Function
procedure die de huidige gebruikersnaam retourneert. Vervolgens wordt de externe procedure GetUserNameA
aanroepen als onderdeel van de getUser
procedure.
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
Voorbeeld 2
De DllImportAttribute functie biedt een alternatieve manier om functies in onbeheerde code te gebruiken. In het volgende voorbeeld wordt een geïmporteerde functie gedeclareerde zonder een Declare
instructie te gebruiken.
' 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