共用方式為


AddressOf 運算子

一個一元運算子,使得前置 程序 的位址被傳遞給預期在 參數 列表中該位置有函數指標的 API 程序。

語法

程序名稱的地址

所需的 程序名稱 指定要傳遞的程序位址。 它必須代表該呼叫所屬專案標準模組中的程序。

註解

當程序名稱出現在參數清單中時,通常會評估該程序,並傳遞該程序回傳值的位址。 AddressOf 允許將程序的位址傳遞給 動態連結函式庫 中的 Windows API 函式 () ,而非傳遞程序的回傳值。 API 函式接著可以使用該位址呼叫 Basic 程序,這個程序稱為回調。 AddressOf 運算子僅出現在 API 程序的呼叫中。

雖然你可以使用 AddressOf 在 Basic 程序間傳遞程序指標,但無法在 Basic 中透過此類指標呼叫函式。 這表示,例如,用 Basic 撰寫的 類別 無法透過這樣的指標對其控制器進行回調。 在 Basic 中使用 AddressOf 傳遞程序指標時,所呼叫程序的 參數 必須為 As Long

如果你不完全理解函式回調的概念,使用 AddressOf 可能會產生不可預測的結果。 你必須了解回調的 Basic 部分如何運作,以及你傳遞函式位址的 DLL 程式碼。 除錯此類互動很困難,因為程式與 開發環境運行於相同的程序中。 在某些情況下,系統性除錯可能無法實現。

注意事項

你可以用 Microsoft Visual C++ (或類似工具編譯的 DLL 中建立自己的回調函式原型) 。 要使用 AddressOf,你的原型必須使用 __stdcall 呼叫慣例。 預設的呼叫慣例 (__cdecl) 無法與 AddressOf 一起使用。

由於回調的呼叫者不在你的程式中,因此回調程序中的錯誤不應被傳回呼叫者。 你可以在回調程序的開頭放置「 On Error Resume Next 」語句來達成此目標。

範例

以下範例建立一個表單,裡面有一個按字母排序的系統字型清單。

要執行這個範例,請建立一個表單,上面有一個清單框。 表格的代碼如下:

Option Explicit

Private Sub Form_Load()
    Module1.FillListWithFonts List1
End Sub

將以下程式碼放入模組中。 EnumFontFamilies 函式定義中的第三個參數是一個 Long ,代表一個程序。 參數必須包含程序的位址,而非程序回傳的值。 在呼叫 EnumFontFamilies 時,第三個參數要求 AddressOf 運算子回傳 EnumFontFamProc 程序的位址,也就是你呼叫 Windows API 函式時所提供的回調程序名稱 EnumFontFamilies。 當你將 AddressOf EnumFontFamProc 傳給 EnumFontFamilies 時,Windows 會為系統中每個字型家族呼叫一次 EnumFontFamProc。 最後傳遞給 EnumFontFamilies 的參數指定了顯示資訊的清單框。

'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

另請參閱

支援和意見反應

有關於 Office VBA 或這份文件的問題或意見反應嗎? 如需取得支援服務並提供意見反應的相關指導,請參閱 Office VBA 支援與意見反應