AddressOf-Operator

Ein unärer Operator, durch den die Adresse der Prozedur, der er vorangestellt ist, an eine API-Prozedur übergeben wird, die an dieser Stelle in der Liste der Argumente einen Funktionszeiger erwartet.

Syntax

AddressOf-Prozedurname

Der erforderliche procedurename gibt die Prozedur an, deren Adresse übergeben wird. Sie muss eine Prozedur in einem Standardmodul in dem Projekt darstellen, in dem der Aufruf erfolgt.

HinwBemerkungeneise

Wenn ein Prozedurname in einer Argumentliste angezeigt wird, wird in der Regel die Prozedur ausgewertet, und die Adresse des Rückgabewerts der Prozedur wird übergeben. AddressOf ermöglicht es, die Adresse der Prozedur an eine Windows-API-Funktion in einer Dynamic Link Library (DLL) zu übergeben, anstatt den Rückgabewert der Prozedur zu übergeben. Die API-Funktion kann dann die Adresse verwenden, um die Basic-Prozedur aufzurufen, einen Prozess, der als Rückruf bezeichnet wird. Der AddressOf-Operator wird nur im Aufruf der API-Prozedur angezeigt.

Sie können zwar mit AddressOf Prozedurzeiger zwischen Basic-Prozeduren übergeben, doch können Sie mit einem solchen Zeiger keine Funktion innerhalb von Basic aufrufen. Dies bedeutet beispielsweise, dass eine in Basic geschriebene Klasse keinen Rückruf an ihren Controller mit einem solchen Zeiger ausführen kann. Wird AddressOf verwendet, um einen Prozedurzeiger zwischen Prozeduren in Basic zu übergeben, muss der Parameter der aufgerufenen Prozedur als As Long eingegeben werden.

Die Verwendung von AddressOf kann zu unvorhersehbaren Ergebnissen führen, wenn Sie mit dem Konzept von Funktionsrückrufen nicht vollständig vertraut sind. Sie müssen wissen, wie der Basic-Teil des Rückrufs und der Code der DLL funktioniert, an den Sie die Funktionsadresse übergeben. Das Debuggen solcher Interaktionen ist schwierig, da das Programm im gleichen Prozess wie die Entwicklungsumgebung ausgeführt wird. In manchen Fällen ist ein systematisches Debuggen vielleicht nicht möglich.

Hinweis

[!HINWEIS] Sie können eigene Prototypen für Rückruffunktionen in DLLs erstellen, die mit Microsoft Visual C++ (oder ähnlichen Tools) kompiliert werden. Damit AddressOf mit dem Prototyp funktioniert, muss dieser die Aufrufkonvention __stdcall verwenden. Die Standardaufrufkonvention (__cdecl) kann mit AddressOf nicht verwendet werden.

Da sich der Aufrufer eines Rückrufs nicht in Ihrem Programm befindet, ist es wichtig, dass ein Fehler in der Rückrufprozedur nicht zurück an den Aufrufer weitergegeben wird. Fügen Sie hierzu die On Error Resume Next-Anweisung am Anfang der Rückrufprozedur ein.

Beispiel

Im folgenden Beispiel wird ein Formular mit einem Listenfeld erstellt, das eine alphabetisch sortierte Liste der Schriften im System enthält.

Erstellen Sie ein Formular mit einem Listenfeld, um diesen Beispielcode auszuführen. Der Code für das Formular lautet wie folgt:

Option Explicit

Private Sub Form_Load()
    Module1.FillListWithFonts List1
End Sub

Fügen Sie den folgenden Code in ein Modul ein. Das dritte Argument in der Definition der EnumFontFamilies-Funktion ist ein Long -Argument, das eine Prozedur darstellt. Das Argument muss die Adresse der Prozedur und nicht den Wert enthalten, den die Prozedur zurückgibt. Im Aufruf von EnumFontFamilies benötigt das dritte Argument den AddressOf -Operator, um die Adresse der EnumFontFamProc-Prozedur zurückzugeben, wobei es sich um den Namen der Rückrufprozedur handelt, den Sie beim Aufruf der Windows-API-Funktion EnumFontFamilies angeben. Windows ruft EnumFontFamProc einmal für jede Schriftartenfamilie im System auf, wenn AddressOf EnumFontFamProc an EnumFontFamilies übergeben wird. Das letzte an EnumFontFamilies übergebene Argument gibt das Listenfeld an, in dem die Informationen angezeigt werden.

'Font enumeration types
Public Const LF_FACESIZE = 32
Public Const LF_FULLFACESIZE = 64

Type LOGFONT
        lfHeight As Long
        lfWidth As Long
        lfEscapement As Long
        lfOrientation As Long
        lfWeight As Long
        lfItalic As Byte
        lfUnderline As Byte
        lfStrikeOut As Byte
        lfCharSet As Byte
        lfOutPrecision As Byte
        lfClipPrecision As Byte
        lfQuality As Byte
        lfPitchAndFamily As Byte
        lfFaceName(LF_FACESIZE) As Byte
End Type

Type NEWTEXTMETRIC
        tmHeight As Long
        tmAscent As Long
        tmDescent As Long
        tmInternalLeading As Long
        tmExternalLeading As Long
        tmAveCharWidth As Long
        tmMaxCharWidth As Long
        tmWeight As Long
        tmOverhang As Long
        tmDigitizedAspectX As Long
        tmDigitizedAspectY As Long
        tmFirstChar As Byte
        tmLastChar As Byte
        tmDefaultChar As Byte
        tmBreakChar As Byte
        tmItalic As Byte
        tmUnderlined As Byte
        tmStruckOut As Byte
        tmPitchAndFamily As Byte
        tmCharSet As Byte
        ntmFlags As Long
        ntmSizeEM As Long
        ntmCellHeight As Long
        ntmAveWidth As Long
End Type

' ntmFlags field flags
Public Const NTM_REGULAR = &H40&
Public Const NTM_BOLD = &H20&
Public Const NTM_ITALIC = &H1&

'  tmPitchAndFamily flags
Public Const TMPF_FIXED_PITCH = &H1
Public Const TMPF_VECTOR = &H2
Public Const TMPF_DEVICE = &H8
Public Const TMPF_TRUETYPE = &H4

Public Const ELF_VERSION = 0
Public Const ELF_CULTURE_LATIN = 0

'  EnumFonts Masks
Public Const RASTER_FONTTYPE = &H1
Public Const DEVICE_FONTTYPE = &H2
Public Const TRUETYPE_FONTTYPE = &H4

Declare Function EnumFontFamilies Lib "gdi32" Alias _
     "EnumFontFamiliesA" _
     (ByVal hDC As Long, ByVal lpszFamily As String, _ 
     ByVal lpEnumFontFamProc As Long, LParam As Any) As Long
Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, _
     ByVal hDC As Long) As Long

Function EnumFontFamProc(lpNLF As LOGFONT, lpNTM As NEWTEXTMETRIC, _ 
     ByVal FontType As Long, LParam As ListBox) As Long
Dim FaceName As String
Dim FullName As String
    FaceName = StrConv(lpNLF.lfFaceName, vbUnicode)
    LParam.AddItem Left$(FaceName, InStr(FaceName, vbNullChar) - 1)
    EnumFontFamProc = 1
End Function

Sub FillListWithFonts(LB As ListBox)
Dim hDC As Long
    LB.Clear
    hDC = GetDC(LB.hWnd)
    EnumFontFamilies hDC, vbNullString, AddressOf EnumFontFamProc, LB
    ReleaseDC LB.hWnd, hDC
End Sub

Siehe auch

Support und Feedback

Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.