哈,拾分了。这几天俺恰好实现了回调VB的类成员函数,知道了如何取得Class中的函数地址,具体思路如下:
第一步,获得Class的内存结构。
第二步,根据内存结构获得虚函数表。
第三步,根据虚函数表获得成员函数的地址。
获得函数地址的代码如下:
Dim pThis As Long, pVtbl As Long, pFunc As Long
需要说明的是如何取得函数序号。因为在虚函数表中,前7个成员函数为IUnknown的3个成员函数和IDispatch的4个成员函数,故从第8个开始为用户在类中定义的成员函数,而且,它们是根据Public和Private属性在CLS中的顺序排列的,不过,它是先排完Public,然后再排Private。
具体代码如下:
假设类Class1中有以下几个函数:
Private Sub a1(ByVal p1 As Long, ByVal p2 As Long, ByVal p3 As Long, ByVal p4 As Long) 'As Long
Debug.Print "a1", p1, p2, p3, p4
End Sub
Public Sub a2()
Debug.Print "a2"
End Sub
Public Sub a3()
Debug.Print "a3"
End Sub
Public Sub a4()
Debug.Print "a4"
End Sub
Private Sub Class_Initialize()
Debug.Print "init"
End Sub
则第一个成员函数为a2,第二个为a3,第三个为a4,第四个为a1,第五个为Class_Initialize。