经你这么一提示,我想起了在vb中调用copyMemory这个API函数时
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSrc As Any, ByVal ByteLen As Long)
API的声明中为byref,但在调用时却可以用byval来表示传递的是地址值,不需要再费心去取变量的地址了。
暂时只想到这么一个例外的情况,在vb中自己写的函数貌似确实是“对于使用ByRef说明的形参,在过程调用时形参和实参只能按传址方式结合”
没想到2级vb考试居然还考api ??
不是说“不按传地址方式结合”,而是在用copymemory这个API函数时,可以使用byval,也可以不使用byval,只是对传入的参数的解释方式不同而已,估计vb在编译时悄悄地帮我们做了一些工作。
如
Sub SwapPtr(sA As String, sB As String)
Dim lTmp As Long
CopyMemory lTmp, ByVal VarPtr(sA), 4
CopyMemory ByVal VarPtr(sA), ByVal VarPtr(sB), 4
CopyMemory ByVal VarPtr(sB), lTmp, 4
End Sub
一般自己写的函数我还没见到过“明明声明为byref,但调用时却用byval的”。这样做会出现编译错误“类型不匹配”