AddressOf 運算子
一元運算子,會將它之前之 程式 的位址傳遞至 API 程式,而該程式需要在 自 變數清單中該位置的函式指標。
語法
AddressOfprocedurename
必要的 procedurename 會指定要傳遞其位址的程式。 它必須代表專案中進行呼叫之標準模組中的程式。
註解
當程式名稱出現在引數清單中時,通常會評估程式,並傳遞程式傳回值的位址。 AddressOf 允許將程式的位址傳遞至動態連結程式庫中的 Windows API 函 式, (DLL) ,而不是傳遞程式的傳回值。 然後,API 函式可以使用 位址來呼叫基本程式,也就是稱為回呼的進程。 AddressOf運算子只會出現在 API 程式的呼叫中。
雖然您可以使用 AddressOf 在基本程式之間傳遞程式指標,但您無法從 Basic 中透過這類指標呼叫函式。 例如,這表示以 Basic 撰寫的 類別 無法使用這類指標對其控制器進行回呼。 使用 AddressOf 在 Basic 內的程式之間傳遞程式指標時,所呼叫程式的 參數 必須輸入 為 Long。
如果您不完全瞭解函式回呼的概念,使用 AddressOf 可能會造成無法預期的結果。 您必須瞭解回呼的基本部分運作方式,以及您要傳遞函式位址的 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 支援與意見反應。