Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 ]
Onderdelen
| Termijn | Definitie |
|---|---|
attributelist |
Facultatief. Zie de lijst met kenmerken. |
accessmodifier |
Facultatief. Dit kan een van de volgende zijn: - Publiek - Beschermd - Vriend - Privé - Beveiligde vriend - Privé beveiligd Zie Access-niveaus in Visual Basic. |
Shadows |
Facultatief. Zie schaduwen. |
charsetmodifier |
Facultatief. 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 |
Verplicht. Naam van deze externe verwijzing. Zie Gedeclareerde elementnamen voor meer informatie. |
Lib |
Verplicht. Introduceert een Lib component, die het externe bestand (DLL of coderesource) identificeert dat een externe procedure bevat. |
libname |
Verplicht. Naam van het bestand dat de gedeclareerde procedure bevat. |
Alias |
Facultatief. 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.
Reglement
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
Shareddeclareren 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
Overridesinstructie ,Overridable, ,NotOverridable,MustOverride, ofImplementsHandlestrefwoordDeclareniet 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 eenAliascomponent 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.Opmerking
Namen van invoerpunten in de meeste DLL's zijn hoofdlettergevoelig.
Nummer van externe procedure. U kunt ook een
Aliascomponent gebruiken om het rangnummer van het toegangspunt in de exporttabel van het externe bestand op te geven. Hiervoor begintaliasnameu 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 Strictdat 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. Binnenparameterlistgebruikt u eenAscomponent om het gegevenstype van het argument op te geven dat aan elke parameter moet worden doorgegeven.Opmerking
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
Integerparameter (16 bits in Visual Basic 6.0), moet u het bijbehorende argument identificeren zoalsShortin deDeclareinstructie, omdat dat het 16-bits geheel getaltype is in Visual Basic. Heeft ookLongeen andere gegevensbreedte in Visual Basic 6.0 enDatewordt anders geïmplementeerd.Gegevenstype retourneren. Als de externe procedure een
FunctionenOption Strictander 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.Opmerking
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 Strictdat het isOffen 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.ObjectOpmerking
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
Bereik 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
FunctionofSubprocedure 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
parameterlistin deDeclareinstructie. 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 opgegevenreturntypein deDeclareinstructie.Tekensets. U kunt opgeven
charsetmodifierhoe Visual Basic marshal strings moet gebruiken wanneer deze de externe procedure aanroept. DeAnsiwijzigingsfunctie stuurt Visual Basic naar marshal alle tekenreeksen naar ANSI-waarden en deUnicodewijzigingsfunctie stuurt deze door naar marshal alle tekenreeksen naar Unicode-waarden. DeAutowijzigingsfunctie stuurt Visual Basic naar marshal strings op basis van .NET Framework-regels op basis van de externe verwijzingname, ofaliasnameindien opgegeven. De standaardwaarde isAnsi.charsetmodifiergeeft ook op hoe Visual Basic de externe procedure in het externe bestand moet opzoeken.AnsienUnicodebeide direct Visual Basic om deze op te zoeken zonder de naam ervan te wijzigen tijdens de zoekopdracht.AutoStuurt 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
Declareinstructie 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