读书人

byref跟byval的调用规则晕了.

发布时间: 2013-01-01 14:04:18 作者: rapoo

byref和byval的调用规则,晕了......
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByRef Destination As Long, ByRef Source As Long, ByVal Length As Long)

或者声明为;
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)


如下调用;
Dim a As Long
Dim b As Long
Dim addr_a As Long
Dim addr_b As Long
a = 1234
addr_a = VarPtr(a)
addr_b = VarPtr(b)
CopyMemory ByVal addr_b, ByVal addr_a, 4
Debug.Print b

可以执行,且必须要加byval。

那为什么自定义函数,形参用byref声明,传递实参的时候声明为byval的时候,编译会报错。

[解决办法]
基本概念,传值,传地址的问题,具体可以查阅MSDN
[解决办法]

引用:
引用:
VB对外部过程(Declare声明)和内部过程(包括自定义)处理方式不太一样,VB不允许直接传递指针给一个内部过程,但可以给外部的

有相关的资料或文档吗?

首先VB的语义中是没有指针类型这个概念的,也就不允许地址作为参数传来传去的;
形参ByRef Destination As Long,相当于过程告诉编译器"我需要一个长整型数的地址",
调用时CopyMemory ByVal addr_b...的ByVal相当于“把addr_b的值传给它”,即把addr_b的值作为地址(指针类型)传给过程。
VB没有指针类型,对内部过程来说当然就出错了(类型不符),但外部过程可能的确需要这样做,出于兼容性,VB就把外部过程和内部过程区别对待了

读书人网 >VB

热点推荐