急!如何获得CLASS中的过程或函数地址?

msw3c 2009-05-26 12:31:57
如题。
...全文
89 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyserver 2009-05-26
  • 打赏
  • 举报
回复
哈,拾分了。这几天俺恰好实现了回调VB的类成员函数,知道了如何取得Class中的函数地址,具体思路如下:
第一步,获得Class的内存结构。
第二步,根据内存结构获得虚函数表。
第三步,根据虚函数表获得成员函数的地址。
获得函数地址的代码如下:
Dim pThis As Long, pVtbl As Long, pFunc As Long

pThis = ObjPtr(obj)
CopyMemory pVtbl, ByVal pThis, 4
CopyMemory pFunc, ByVal pVtbl + (6 + 函数序号) * 4, 4
pFunc就是Class中的成员函数地址。

需要说明的是如何取得函数序号。因为在虚函数表中,前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。

可以通过查询函数表获得,具体办法是:
如果想获得a1的地址,则代码为CopyMemory pFunc, ByVal pVtbl + (6 + 4) * 4, 4,即函数顺序为4。
msw3c 2009-05-26
  • 打赏
  • 举报
回复
谢谢lyserver,我和同事们试一下再结.

864

社区成员

发帖
与我相关
我的任务
社区描述
VB COM/DCOM/COM+
c++ 技术论坛(原bbs)
社区管理员
  • COM/DCOM/COM+社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧