AddressOf-OperatorAddressOf 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.A unary operator that causes the address of the procedure it precedes to be passed to an API procedure that expects a function pointer at that position in the argument list.

SyntaxSyntax

AddressOf __ ProcedureAddressOfprocedurename

Der erforderliche procedurename gibt die Prozedur an, deren Adresse übergeben wird.The required procedurename specifies the procedure whose address is to be passed. Es muss eine Prozedur in einem Standardmodul in dem Projekt darstellen, in dem der Aufruf erfolgt.It must represent a procedure in a standard module in the project in which the call is made.

HinweiseRemarks

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.When a procedure name appears in an argument list, usually the procedure is evaluated, and the address of the procedure's return value is passed. Mit AddressOf kann die Adresse der Prozedur an eine Windows-API-Funktion in einer Dynamic Link Library (dll)übergeben werden, anstatt den Rückgabewert der Prozedur zu übergeben.AddressOf permits the address of the procedure to be passed to a Windows API function in a dynamic-link library (DLL), rather than passing the procedure's return value. Die API-Funktion kann dann die Adresse verwenden, um die grundlegende Prozedur aufzurufen, ein Prozess, der als Rückruf bezeichnet wird.The API function can then use the address to call the Basic procedure, a process known as a callback. Der AddressOf -Operator wird nur im Aufruf der API-Prozedur angezeigt.The AddressOf operator appears only in the call to the API procedure.

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.Although you can use AddressOf to pass procedure pointers among Basic procedures, you can't call a function through such a pointer from within Basic. Dies bedeutet beispielsweise, dass eine in Basic geschriebene Klasse mithilfe eines solchen Zeigers keinen Rückruf an den Controller vornehmen kann.This means, for example, that a class written in Basic can't make a callback to its controller by using such a pointer. Wird AddressOf verwendet, um einen Prozedurzeiger zwischen Prozeduren in Basic zu übergeben, muss der Parameter der aufgerufenen Prozedur als As Long eingegeben werden.When using AddressOf to pass a procedure pointer among procedures within Basic, the parameter of the called procedure must be typed As Long.

Die Verwendung von AddressOf kann zu unvorhersehbaren Ergebnissen führen, wenn Sie mit dem Konzept von Funktionsrückrufen nicht vollständig vertraut sind.Using AddressOf may cause unpredictable results if you don't completely understand the concept of function callbacks. Sie müssen wissen, wie der Basic-Teil des Rückrufs und der Code der DLL funktioniert, an den Sie die Funktionsadresse übergeben.You must understand how the Basic portion of the callback works, and also the code of the DLL into which you are passing your function address. Das Debuggen solcher Interaktionen ist schwierig, da das Programm im gleichen Prozess ausgeführt wird wie die Entwicklungsumgebung.Debugging such interactions is difficult because the program runs in the same process as the development environment. In manchen Fällen ist ein systematisches Debuggen vielleicht nicht möglich.In some cases, systematic debugging may not be possible.

Hinweis

[!HINWEIS] Sie können eigene Prototypen für Rückruffunktionen in DLLs erstellen, die mit Microsoft Visual C++ (oder ähnlichen Tools) kompiliert werden.You can create your own call-back function prototypes in DLLs compiled with Microsoft Visual C++ (or similar tools). Damit AddressOf mit dem Prototyp funktioniert, muss dieser die Aufrufkonvention __stdcall verwenden.To work with AddressOf, your prototype must use the __stdcall calling convention. Die Standardaufrufkonvention (__cdecl) kann mit AddressOf nicht verwendet werden.The default calling convention (__cdecl) will not work with AddressOf.

Da sich der Aufrufer eines Rückrufs nicht in Ihrem Programm befindet, ist es wichtig, dass ein Fehler in der Rückrufprozedur nicht an den Aufrufer zurückgegeben wird.Because the caller of a callback is not within your program, it is important that an error in the callback procedure not be propagated back to the caller. Fügen Sie hierzu die On Error Resume Next-Anweisung am Anfang der Rückrufprozedur ein.You can accomplish this by placing the On Error Resume Next statement at the beginning of the callback procedure.

BeispielExample

Im folgenden Beispiel wird ein Formular mit einem Listenfeld erstellt, das eine alphabetisch sortierte Liste der Schriften im System enthält.The following example creates a form with a list box containing an alphabetically sorted list of the fonts in your system.

Erstellen Sie ein Formular mit einem Listenfeld, um diesen Beispielcode auszuführen.To run this example, create a form with a list box on it. Der Code für das Formular lautet wie folgt:The code for the form is as follows:

Option Explicit

Private Sub Form_Load()
    Module1.FillListWithFonts List1
End Sub

Fügen Sie den folgenden Code in ein Modul ein.Place the following code in a module. Das dritte Argument in der Definition der EnumFontFamilies-Funktion ist ein Long -Argument, das eine Prozedur darstellt.The third argument in the definition of the EnumFontFamilies function is a Long that represents a procedure. Das Argument muss die Adresse der Prozedur und nicht den Wert enthalten, den die Prozedur zurückgibt.The argument must contain the address of the procedure, rather than the value that the procedure returns. 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.In the call to EnumFontFamilies, the third argument requires the AddressOf operator to return the address of the EnumFontFamProc procedure, which is the name of the callback procedure you supply when calling the Windows API function, EnumFontFamilies. Windows ruft EnumFontFamProc einmal für jede Schriftartenfamilie im System auf, wenn AddressOf EnumFontFamProc an EnumFontFamilies übergeben wird.Windows calls EnumFontFamProc once for each of the font families on the system when you pass AddressOf EnumFontFamProc to EnumFontFamilies. Das letzte an EnumFontFamilies übergebene Argument gibt das Listenfeld an, in dem die Informationen angezeigt werden.The last argument passed to EnumFontFamilies specifies the list box in which the information is displayed.

'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 auchSee also

Support und FeedbackSupport and feedback

Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation?Have questions or feedback about Office VBA or this documentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.