一個一元運算子,使得前置 程序 的位址被傳遞給預期在 參數 列表中該位置有函數指標的 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 支援與意見反應。