指针在VB中如何用法啊,有什么好处,有例子吗,

2024-12-05 03:02:24
推荐回答(1个)
回答1:

调用函数指针,在Delphi,VC及汇编中,是非常简单的事情,所以,如果你不是VB程序员,请不要浪费你的时间,不要再看这篇文章了。。

在VB中就不能直接调用了,VB唯一与之有点关系的就是AddressOf 操作符,所有VB程序都知道,它能取得模块内的函数地址,看到这里,相信很多VB程序员马上就说,调用函数指针,用 CallWindowProc 不就可以啦,还有什么可以讲的,呵呵,不错,你掌握了这个技巧!是的,这确实是利用这个API可以调用函数指针,不过呢,它只支持4个参数,给你的应用带来很多不便。又有程序员要讲了,四个参数我可以扩展到任意功能呀,比如将其中一个参数传入的是一个结构块的指针,在结构中我可以随意的定义数据呀。鼓掌!鼓掌!鼓掌!很不错!是的,你完全可以这样做。不过呢,如果有一个函数不是你写的呢,你了解这个函数的所有参数及意义,也得到了它的指针,你怎么调用呀?惨了!呵呵。不过不被困难吓倒的你可能又说,呵呵,有了,在《高级VB编程》这本被称为VB程序员的圣经的书中有解决方案。鼓掌!鼓掌!鼓掌!不过,太累了!太累了,我对这本书的评价就是,它确实是一本高深,很值得读的书。不过,毕竟作者的宗旨是基于COM为出发点,再来解决问题的。所以难免很多事情复杂化了,(题外话,很多朋友同我讲,说这本书很难看懂,呵呵,如果你研究一下COM,你就很容易读懂这本书了!)

下面,我所提供的方法就是,利用嵌入一段汇编代码,借助 CallWindowProc 函数实现调用任意个数的参数(当然参数类型也任意啦)的函数指针的能力。

有关CallWindowProc 调用函数指针,在这我就不重复介绍了,毕竟掌握的人很多,网上资料也一大把的。我就省了它吧

Private Declare Function CallAsmCode Lib "user32" Alias "CallWindowProcA" (lpPrevWndFunc As Long, _ ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, lParam As Long) As Long

'------------------------------------------------------
' 功能:借用API调用任意个数参数的函数的纯VB实现版.
' 此函数内部自带SEH错误处理机制,但并不保证任意
' 错误调用均不会让您的VB崩溃(比如破坏栈平衡后返回)
' 作者:阿国哥 hackor@yeah.net
'------------------------------------------------------
Private Function CallAnyFunc(ByVal pFn As Long, ByVal pParam As Long, ByVal Count As Long) As Long
Dim CallAnyFuncCode(34) As Long, lRet As Long
CallAnyFuncCode(0) = &H53EC8B55
CallAnyFuncCode(1) = &HE8&
CallAnyFuncCode(2) = &HEB815B00
CallAnyFuncCode(3) = &H1000112C
CallAnyFuncCode(4) = &H114A938D
CallAnyFuncCode(5) = &H64521000
CallAnyFuncCode(6) = &H35FF&
CallAnyFuncCode(7) = &H89640000
CallAnyFuncCode(8) = &H25&
CallAnyFuncCode(9) = &H8B1FEB00
CallAnyFuncCode(10) = &HE80C2444
CallAnyFuncCode(11) = &H0&
CallAnyFuncCode(12) = &H53E98159
CallAnyFuncCode(13) = &H8D100011
CallAnyFuncCode(14) = &H119791
CallAnyFuncCode(15) = &HB8908910
CallAnyFuncCode(16) = &H33000000
CallAnyFuncCode(17) = &H558BC3C0
CallAnyFuncCode(18) = &H104D8B0C
CallAnyFuncCode(19) = &HEB8A148D
CallAnyFuncCode(20) = &HFC528D06 CallAnyFuncCode(21) = &HB4932FF
CallAnyFuncCode(22) = &H8BF675C9
CallAnyFuncCode(23) = &HD0FF0845
CallAnyFuncCode(24) = &H58F64
CallAnyFuncCode(25) = &H83000000
CallAnyFuncCode(26) = &H4D8B04C4
CallAnyFuncCode(27) = &H5B018914
CallAnyFuncCode(28) = &H10C2C9
CallAnyFuncCode(29) = &H58F64
CallAnyFuncCode(30) = &H83000000
CallAnyFuncCode(31) = &HC03304C4
CallAnyFuncCode(32) = &H89144D8B
CallAnyFuncCode(33) = &HC2C95B21
CallAnyFuncCode(34) = &H90900010
CallAnyFunc = CallAsmCode(CallAnyFuncCode(0), pFn, pParam, Count, lRet)
If CallAnyFunc <> lRet Then
CallAnyFunc = 0 '这里表示出现严重错误,你应当再了解目的函数的使用方法
Debug.Assert False '因为你的参数传递问题,导致程序已出现了非法操作。
End If
End Function

下面介绍一下如何使用这个函数

参数一(pFn ):函数指针
参数二(pParam ):参数指针,指向一个连续的内存块,比如目的函数有三个参数,分别为A,B,C。你可以定义一个结构,结构体为A,B,C(每个参数均为4字节长),然后传这个结构的地址。
参数三(Count ):参数个数。
返回:目的函数的返回值。(你可以修改成其它类型的返回值)