Option Explicit
Private Declare Function SendMessageByRef Lib "user32" Alias "SendMessageA" (ByRef hWnd As Long, ByRef wMsg As Long, ByRef wParam As Long, ByRef lParam As Any) As Long
Private Declare Function SendMessageByVal Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Const CB_ADDSTRING = &H143
Private Sub Command1_Click()
Dim II As Long
Dim t As Long
Dim s As String
Combo1.Clear
t = GetTickCount()
''''使用API ByRef
For II = 1 To 10000
s = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
''''重新赋值以改变地址
SendMessageByRef Combo1.hWnd, CB_ADDSTRING, 0, s
Next
MsgBox "ByRef " & GetTickCount - t
Combo1.Clear
t = GetTickCount()
''''使用API ByVal
For II = 1 To 10000
s = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
SendMessageByVal Combo1.hWnd, CB_ADDSTRING, 0, s
Next
MsgBox "ByVal " & GetTickCount - t
Combo1.Clear
t = GetTickCount()
''''使用普通 ComboBox Add
For II = 1 To 10000
s = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
Combo1.AddItem s
Next
MsgBox "ComboBox Add " & GetTickCount - t
End Sub
将 API 传参方式改为 ByRef ,可以提升速度,当然不是所有得API 得参数都能这么改,具体得看 API 函数内是否会对传入得参数进行修改,或者你是否还要继续使用 被传入得参数。