Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Deklariert einen Verweis auf eine in einer externen Datei implementierte Prozedur.
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 ]
Bestandteile
| Begriff | Definition |
|---|---|
attributelist |
Wahlfrei. Siehe Attributliste. |
accessmodifier |
Wahlfrei. Dabei kann es sich um eine der folgenden Methoden handeln: - Öffentlich - Geschützt - Freund - Privat - Geschützter Freund - Privat geschützt Siehe Access-Ebenen in Visual Basic. |
Shadows |
Wahlfrei. Siehe Schatten. |
charsetmodifier |
Wahlfrei. Gibt Zeichensatz- und Dateisuchinformationen an. Dabei kann es sich um eine der folgenden Methoden handeln: - Ansi (Standard) - Unicode - Automatisch |
Sub |
Optional, aber entweder Sub oder Function muss angezeigt werden. Gibt an, dass die externe Prozedur keinen Wert zurückgibt. |
Function |
Optional, aber entweder Sub oder Function muss angezeigt werden. Gibt an, dass die externe Prozedur einen Wert zurückgibt. |
name |
Erforderlich. Name dieses externen Verweises. Weitere Informationen finden Sie unter "Deklarierte Elementnamen". |
Lib |
Erforderlich. Führt eine Lib Klausel ein, die die externe Datei (DLL oder Coderessource) identifiziert, die eine externe Prozedur enthält. |
libname |
Erforderlich. Der Name der Datei, die die deklarierte Prozedur enthält. |
Alias |
Wahlfrei. Gibt an, dass die deklarierte Prozedur nicht innerhalb der Datei anhand des in nameder Datei angegebenen Namens identifiziert werden kann. Sie geben ihre Identifikation in aliasname. |
aliasname |
Erforderlich, wenn Sie das Alias Schlüsselwort verwenden. Zeichenfolge, die die Prozedur auf eine von zwei Arten identifiziert:Der Einstiegspunktname der Prozedur innerhalb der Datei in Anführungszeichen ( "")-oder- Ein Nummernzeichen ( #) gefolgt von einer ganzen Zahl, die die Ordnungszahl des Einstiegspunkts der Prozedur in der Datei angibt |
parameterlist |
Erforderlich, wenn die Prozedur Parameter akzeptiert. Siehe Parameterliste. |
returntype |
Erforderlich, wenn Function angegeben und Option Strict ist On. Datentyp des von der Prozedur zurückgegebenen Werts. |
Bemerkungen
Manchmal müssen Sie eine Prozedur aufrufen, die in einer Datei (z. B. einer DLL oder Coderessource) außerhalb Ihres Projekts definiert ist. Wenn Sie dies tun, hat der Visual Basic-Compiler keinen Zugriff auf die Informationen, die er benötigt, um die Prozedur ordnungsgemäß aufzurufen, z. B. wo sich die Prozedur befindet, wie sie identifiziert wird, ihre Aufrufsequenz und den Rückgabetyp sowie den von ihm verwendeten Zeichenfolgenzeichensatz. Die Declare Anweisung erstellt einen Verweis auf eine externe Prozedur und stellt diese erforderlichen Informationen bereit.
Sie können nur auf Modulebene verwenden Declare . Dies bedeutet, dass der Deklarationskontext für einen externen Verweis eine Klasse, Struktur oder ein Modul sein muss und keine Quelldatei, namespace, Schnittstelle, Prozedur oder Block sein kann. Weitere Informationen finden Sie unter Deklarationskontexte und Standardzugriffsebenen.
Externe Verweise werden standardmäßig auf den öffentlichen Zugriff festgelegt. Sie können ihre Zugriffsebenen mit den Zugriffsmodifizierern anpassen.
Regeln
Attribute Sie können Attribute auf einen externen Verweis anwenden. Jedes angewendete Attribut hat nur Auswirkungen auf Ihr Projekt, nicht in der externen Datei.
Modifizierer. Externe Prozeduren werden implizit freigegeben. Sie können das
SharedSchlüsselwort nicht verwenden, wenn Sie einen externen Verweis deklarieren, und Sie können den freigegebenen Status nicht ändern.Eine externe Prozedur kann nicht an überschreiben, Schnittstellenmmber implementieren oder Ereignisse behandeln. Dementsprechend können Sie das
OverridesSchlüsselwort ,Overridable,NotOverridableMustOverrideImplementsoderHandlesdas Schlüsselwort nicht in einerDeclareAnweisung verwenden.Name der externen Prozedur. Sie müssen diesem externen Verweis nicht denselben Namen (in
name) wie den Einstiegspunktnamen der Prozedur in der externen Datei (aliasname) zuweisen. Sie können eineAliasKlausel verwenden, um den Einstiegspunktnamen anzugeben. Dies kann hilfreich sein, wenn die externe Prozedur denselben Namen wie ein reservierter Visual Basic-Modifizierer oder eine Variable, Prozedur oder ein anderes Programmierelement im selben Bereich aufweist.Hinweis
Einstiegspunktnamen in den meisten DLLs beachten die Groß-/Kleinschreibung.
Externe Prozedurnummer. Alternativ können Sie eine
AliasKlausel verwenden, um die Ordnungszahl des Einstiegspunkts in der Exporttabelle der externen Datei anzugeben. Dazu beginnenaliasnameSie mit einem Nummernzeichen (#). Dies kann hilfreich sein, wenn ein Beliebiges Zeichen im Namen der externen Prozedur in Visual Basic nicht zulässig ist oder wenn die externe Datei die Prozedur ohne Namen exportiert.
Datentypregeln
Parameterdatentypen. Wenn
Option StrictjaOn, müssen Sie den Datentyp der einzelnen Parameter angeben inparameterlist. Dies kann ein beliebiger Datentyp oder der Name einer Enumeration, Struktur, Klasse oder Schnittstelle sein. Inparameterlistdiesem Bereich verwenden Sie eineAsKlausel, um den Datentyp des Arguments anzugeben, das an jeden Parameter übergeben werden soll.Hinweis
Wenn die externe Prozedur nicht für .NET Framework geschrieben wurde, müssen Sie darauf achten, dass die Datentypen entsprechen. Wenn Sie z. B. einen externen Verweis auf eine Visual Basic 6.0-Prozedur mit einem
IntegerParameter (16 Bit in Visual Basic 6.0) deklarieren, müssen Sie das entsprechende Argument wieShortin derDeclareAnweisung identifizieren, da dies der ganzzahlige 16-Bit-Typ in Visual Basic ist.LongEntsprechend weist visual Basic 6.0 eine andere Datenbreite auf undDatewird anders implementiert.Datentyp zurückgeben. Wenn es sich bei der externen Prozedur um eine
FunctionundOption Strictdies handeltOn, müssen Sie den Datentyp des werts angeben, der an den aufrufenden Code zurückgegeben wird. Dies kann ein beliebiger Datentyp oder der Name einer Enumeration, Struktur, Klasse oder Schnittstelle sein.Hinweis
Der Visual Basic-Compiler überprüft nicht, ob Die Datentypen mit denen der externen Prozedur kompatibel sind. Wenn ein Konflikt vorliegt, generiert die Common Language Runtime zur Laufzeit eine MarshalDirectiveException Ausnahme.
Standarddatentypen. Wenn
Option Strictder Datentyp eines Parameters nichtparameterlistangegeben wirdOff, konvertiert der Visual Basic-Compiler das entsprechende Argument in den Objektdatentyp. Wenn Sie nicht angebenreturntype, verwendet der Compiler den Rückgabedatentyp entsprechendObject.Hinweis
Da Sie sich mit einem externen Verfahren befassen, das möglicherweise auf einer anderen Plattform geschrieben wurde, ist es gefährlich, annahmen über Datentypen zu machen oder sie standardmäßig zuzulassen. Es ist viel sicherer, den Datentyp jedes Parameters und des Rückgabewerts anzugeben, falls vorhanden. Dadurch wird auch die Lesbarkeit des Codes verbessert.
Verhalten
Bereich. Ein externer Verweis befindet sich innerhalb seiner Klasse, Struktur oder des Moduls im Gültigkeitsbereich.
Lebensdauer. Ein externer Verweis hat dieselbe Lebensdauer wie die Klasse, Struktur oder das Modul, in der er deklariert wird.
Aufrufen einer externen Prozedur. Sie rufen eine externe Prozedur auf die gleiche Weise auf, wie Sie eine
FunctionSubProzedur aufrufen – indem Sie sie in einem Ausdruck verwenden, wenn ein Wert zurückgegeben wird, oder indem Sie sie in einer Call-Anweisung angeben, wenn kein Wert zurückgegeben wird.Sie übergeben Argumente genau wie in der Anweisung angegeben
parameterlistan dieDeclareexterne Prozedur. Berücksichtigen Sie nicht, wie die Parameter ursprünglich in der externen Datei deklariert wurden. Wenn ein Rückgabewert vorhandenreturntypeist, verwenden Sie ihn entsprechend der Angabe in derDeclareAnweisung.Zeichensätze. Sie können angeben
charsetmodifier, wie Visual Basic Zeichenfolgen marshallen soll, wenn sie die externe Prozedur aufruft. DerAnsiModifizierer leitet Visual Basic an, alle Zeichenfolgen an ANSI-Werte zu marshallen, und derUnicodeModifizierer leitet ihn an, alle Zeichenfolgen an Unicode-Werte zu marshallen. DerAutoModifizierer leitet Visual Basic gemäß .NET Framework-Regeln basierend auf dem externen Verweisnameoderaliasnamefalls angegeben, visual Basic auf Marshallalzeichenfolgen weiter. Der Standardwert istAnsi.charsetmodifierGibt außerdem an, wie Visual Basic die externe Prozedur innerhalb der externen Datei nachschlagen soll.AnsiundUnicodebeide direct Visual Basic, um es nachzuschlagen, ohne den Namen während der Suche zu ändern.Autoleitet Visual Basic an, um den Basiszeichensatz der Laufzeitplattform zu bestimmen und möglicherweise den Namen der externen Prozedur wie folgt zu ändern:Suchen Sie auf einer Unicode-Plattform wie Windows zuerst die externe Prozedur ohne Namensänderung nach. Wenn dies fehlschlägt, fügen Sie "W" am Ende des Namens der externen Prozedur an, und suchen Sie es erneut.
Suchen Sie auf einer ANSI-Plattform zuerst nach dem externen Verfahren ohne Namensänderung. Wenn dies fehlschlägt, fügen Sie "A" am Ende des Namens der externen Prozedur an, und suchen Sie es erneut.
Mechanismus. Visual Basic verwendet den .NET Framework-Plattform-Aufrufmechanismus (PInvoke), um externe Prozeduren aufzulösen und darauf zuzugreifen. Die
DeclareAnweisung und die DllImportAttribute Klasse verwenden diesen Mechanismus automatisch, und Sie benötigen keine Kenntnisse von PInvoke. Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Aufrufen von Windows-APIs.
Von Bedeutung
Wenn die externe Prozedur außerhalb der Common Language Runtime (CLR) ausgeführt wird, handelt es sich um nicht verwalteten Code. Wenn Sie eine solche Prozedur aufrufen, z. B. eine Windows-API-Funktion oder eine COM-Methode, können Sie Ihre Anwendung Sicherheitsrisiken offenlegen. Weitere Informationen finden Sie unter Secure Coding Guidelines for Unmanaged Code.
Beispiel 1
Im folgenden Beispiel wird ein externer Verweis auf eine Function Prozedur deklariert, die den aktuellen Benutzernamen zurückgibt. Anschließend wird die externe Prozedur als Teil der getUser Prozedur GetUserNameA aufgerufen.
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
Beispiel 2
Dies DllImportAttribute bietet eine alternative Möglichkeit zum Verwenden von Funktionen in nicht verwalteten Code. Im folgenden Beispiel wird eine importierte Funktion deklariert, ohne eine Declare Anweisung zu verwenden.
' 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