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

byref跟byval的调用规则,晕了.

2013-01-01 
byref和byval的调用规则,晕了......Private Declare Sub CopyMemory Lib kernel32 Alias RtlMoveMemory

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就把外部过程和内部过程区别对待了

热点排行