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语言中字符串与字符数组的关系……不知道这样理解对不对以前我很多地方用到过第一种方式,不知道是不是都可以换成第二种方式,如果不行,是为什么?
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语言中字符串与字符数组的关系……不知道这样理解对不对以前我很多地方用到过第一种方式,不知道是不是都可以换成第二种方式,如果不行,是为什么?
字符串传值传址情况比较特殊
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中的值
首先,那个应该叫字节数组,不是字符数组, byte 表示字节,并不是字符的意思
你说字符数组,会让别人误会其次,N长度的字符串是不可能传过去的,传的是字符串首字节地址你说的代替的问题,分情况,象这帖子里面的例子就是可以代替的还有 byval xxx as string 为参数的api, 也可以改为传字节数组,无论怎么传,请无视数据内容和长度
长度只能为4字节,只有4字节数据才能实现真正意义上的传值,否则全部都是传址,只是传的内容不同例如字符串:
byval 传的是字符串首字节地址,这种情况下,被调用的函数可以修改字符串内容,但长度被固定了
传进来的时候有多长,你修改的范围也就多大 byref 传变量地址,vb中,字符串变量是个2级地址类型的数据
〔字符串变量1〕 的真实有效数据为 〔4字节字符串首字节地址〕
在传址情况下,把字符串变量1的地址传过去,被调用的函数可以修改这个变量值的全部内容,
也就不存在长度问题了,可以随便改
说的有点繁琐,需要仔细体会一下,有什么不明白的,再说吧
都胡说,遇见byval 就说是副本,复制,到底复制什么了
应该不是这样吧,VB对于字符串的传递,实际上是将源字符串的字串内容值转换为ansi编码,然后保存到一个临时变量中,再将该临时变量传递给函数
那是调用api和一些特殊的应用情况(put 文件 string等等)的时候才那样
内部的字符串传递完全是 unicode格式的
调用api时候是转换了,即便这种情况下也是遵循我说的那个方式,无论c++,c,或什么其他语言没有一种是把字符串直接复制到栈里面当参数的,全是字符串地址
还纠结这个
传的是字符串首字节地址,传字符串4个字节干嘛使,而且照这个想法,只能显示4个字节字符,实际上不是
msdn的帮助文档里面有说明