首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

实参前byval的作用?该怎么解决

2012-04-21 
实参前byval的作用?[codeVB][/code]dim bytSend(2) as bytebytSend(0) &H35bytSend(1) &H30bytSend(2

实参前byval的作用?
[code=VB][/code]dim bytSend(2) as byte
bytSend(0) = &H35
bytSend(1) = &H30
bytSend(2) = &H30
SendMessage htxt, WM_SETTEXT, 0, bytSend(0)

dim strSend as string 
strsend="500"
SendMessage htxt, WM_SETTEXT, 0, byval strsend

以上这两段代码执行的效果是一样的,不是很理解,谁能帮我解释一下?一般byval是用在形参前,这里用在实参前,有什么特殊意义吗?

LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)这是SendMessage的原型
Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)这是VB中的声明

这里调用的含义,当是定义的字符数组时,按地址传递,第一个元素传递过去是首地址,类似指针的运行;当是字符串传递,必须按值传递,传递过去还是分成了字符数组进行处理,就像c语言中字符串与字符数组的关系……不知道这样理解对不对

以前我很多地方用到过第一种方式,不知道是不是都可以换成第二种方式,如果不行,是为什么?





[解决办法]
byval string 传的是字符串首字节地址
字符串传值传址情况比较特殊
[解决办法]
这与API的声明有关.在最后一个参数为lParam As Any的情况下分析:

第一种情况,等于是byref lparam as byte,因此直接传入了一个字节数组的第一个元素进去,而byref表明了传递进来的是个指针:

bytSend(0)的地址---->API

第二种情况,是将字符串的值转化为integer类型后,再将这个临时的integer变量的地址传到API.

byval strsend(将字符串自动隐式转换为integer,因为内容为数值)---->临时的integer变量的地址---->API

两种方式,在最终到达API时,都是某个变量的地址.
[解决办法]
实参中,参数前加Byval关键字,一般用于API调用时Byref的参数,反之这不可以
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

注意到最后一个参数Lparm没有指明,VB默认为Byref
SendMessage htxt, WM_SETTEXT, 0, bytSend(0)
’此句,按照约定,将bytSend(0)的地址传递给SendMessage 

dim strSend as string
strsend="500"
SendMessage htxt, WM_SETTEXT, 0, byval strsend
'如果没有Byval,则传递的是cstrsend的地址,现在使用byval,则传递的是strsend中的值



[解决办法]
Byval传递副本,也就是在堆栈中开辟一个内存区域,把变量的值付给这个内存区域,只有函数对参数的使用不会影响原参数。

热点排行