有没有办法在类中通过函数名取得函数指针

lorl2 2009-11-06 03:44:13
加精
在类中的,无论是Private 还是Public
能否通过this(me)指针去计算某个函数或过程的首地址?

也就是类似AddressOf算子一样
如同这样 GetMyAddressOf(me,"类自身中的一个涵数名")


...全文
1209 68 打赏 收藏 转发到动态 举报
写回复
用AI写文章
68 条回复
切换为时间正序
请发表友善的回复…
发表回复
MORHH 2009-11-15
  • 打赏
  • 举报
回复
路过..........
PctGL 2009-11-09
  • 打赏
  • 举报
回复
综合你上面说的,再加上那个 GetClassProcAddress 就可以了,更多的内容,我再4l说过了。
lorl2 2009-11-09
  • 打赏
  • 举报
回复
GetTypeInfo.AddressOfMember()
这个涵数有点似呼有点看头,可惜我GOOGLE不到详细的说明
lorl2 2009-11-09
  • 打赏
  • 举报
回复
不是BT,偶的想法是,一个可以为了在类里面实现AddressOf ,另一个是为了Hook COM

我查了一下GetIDsOfNames()的用法,结果指针取不到,倒是误打误撞,搞到了个CallByName()的实现方法


'=====================类 : Class1===========
Public Function ABCDEFG()
MsgBox "OK"
End Function
'===========================================

'*******************************************
Option Explicit
Private Const IID_NULL As String = "{00000000-0000-0000-0000-000000000000}"
Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long

Private Sub Command1_Click()
Dim obj As Class1

Dim IDispatch As olelib.IDispatch
Dim DISPID As Long
Dim IID_NULL_UUID As UUID

Dim tmp As Long
Dim praram As olelib.DISPPARAMS
Dim exc As olelib.EXCEPINFO
Dim ivk As INVOKEKIND
Dim ti As ITypeInfo

Set obj = New Class1
Set IDispatch = obj

tmp = VarPtr(DISPID)

Call olelib.CLSIDFromString(IID_NULL, IID_NULL_UUID)

'这两句,可以实现CallByName()
Call IDispatch.GetIDsOfNames(IID_NULL_UUID, "ABCDEFG", 1, GetUserDefaultLCID(), tmp)
IDispatch.Invoke tmp, IID_NULL_UUID, GetUserDefaultLCID, DISPATCH_METHOD, praram, DISPID, exc, tmp

Debug.Print IDispatch.GetTypeInfo(0, GetUserDefaultLCID()).AddressOfMember(tmp, INVOKE_FUNC)
' tmp = Poke(DISPID)

obj.ABCDEFG

Set IDispatch = Nothing
Set obj = Nothing
End Sub
'*******************************************


PctGL 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 58 楼 lorl2 的回复:]
引用 52 楼 dingxiaoyu777 的回复:
这个没办法做到通用啊



不行啊,
假定你的这个办法写了一个涵数:

'Obj传入对像
'strSubName  准备要取得的涵数指针
function GetObjectFuncPtr(obj as Object ,strSubName as string )as long


这时候调用者只有一个己实例好的对象,和己知的过程名,对象的实现代码不是他写的,那他没有办法取得指针了
你的方法只能取得自己写死的类对像中的涵数指针,不能按过程名取得别人写好的类中的涵数指针
[/Quote]


首先说,为什么你要用这种方法调用类中的函数?是不是太。。。。

其次说解决方法,这个方法是有一定的限制
1个限制,必须是 VB 的对象,而且是基类对象
如果是对窗口对象,控件对象直接这样做将会出现错误,除非首先找到真正的基类对象句柄

再说如果在以上的限制之内,那么完全可以的,这个函数的原理其实就是用汇编写了一个类中的
函数调用的小函数,外部调用这个函数时就象标准函数一样,比如和标准模块中的函数一样

再简单点说就是在标准模块中写了一个函数,然后在这个函数中调用了类中的函数,模块中的函数
地址你有了,你可以直接给 callback之类的api使用

vb编译对象中的函数,属性,一般情况下的规则就是自代码顶端,先公用,再私用的方法依次编译
实际上,这个依次就是 ID ,所以你要明确的知道函数在类中的顺序,然后调用这个方法,他才能正确的
解析到正确的函数,才能正确的调用

lz的要求太bt了。。。
kolige 2009-11-09
  • 打赏
  • 举报
回复
自己写的类还好说,通用的话....
学习学习.
stf_smile 2009-11-09
  • 打赏
  • 举报
回复
路过,学习
lorl2 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 dingxiaoyu777 的回复:]
这个没办法做到通用啊

[/Quote]

不行啊,
假定你的这个办法写了一个涵数:

'Obj传入对像
'strSubName 准备要取得的涵数指针
function GetObjectFuncPtr(obj as Object ,strSubName as string )as long


这时候调用者只有一个己实例好的对象,和己知的过程名,对象的实现代码不是他写的,那他没有办法取得指针了
你的方法只能取得自己写死的类对像中的涵数指针,不能按过程名取得别人写好的类中的涵数指针
tower1 2009-11-09
  • 打赏
  • 举报
回复
看看!
Tiger_Zhao 2009-11-09
  • 打赏
  • 举报
回复
继续推荐《高级Visual Basic编程》(Advanced Visual Basic)
特别是第十一章。
shaonew 2009-11-09
  • 打赏
  • 举报
回复
砖家在哪啊
jkgao 2009-11-09
  • 打赏
  • 举报
回复
学习一下~
XIMO914 2009-11-09
  • 打赏
  • 举报
回复
...............
嗷嗷叫的老马 2009-11-09
  • 打赏
  • 举报
回复
BT VS WS,不正好么,哈哈.
wjs496249880 2009-11-08
  • 打赏
  • 举报
回复
回帖赚积分而已
PctGL 2009-11-08
  • 打赏
  • 举报
回复
到底怎么才算通用? 或者是那些说不通用的人根本就没看明白这是干什么用的和怎么用的?
DINGXIAOYU777 2009-11-08
  • 打赏
  • 举报
回复
这个没办法做到通用啊
xianxuezichen 2009-11-08
  • 打赏
  • 举报
回复
来学习学习~~~
goodplaygames 2009-11-08
  • 打赏
  • 举报
回复
xuexi
丈剑走天涯 2009-11-08
  • 打赏
  • 举报
回复
都是专家
加载更多回复(45)

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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