使用VB6 + Windows 7传递ByRef的参数

时间:2013-07-03 16:56:35

标签: windows vb6 parameter-passing byref

我已经和VB6合作多年了,但我碰到了一些比较奇怪的东西,我自己也无法证实这个结果。因此,我想知道以下代码的输出是否为

  

7

     

7

  

7

     

6

以下是代码:

Option Explicit

Private Sub cmdOk_Click()
Dim V As Integer
V = 6
Call AddV(V)
Print V

End Sub

Sub AddV(ByRef P As Integer)
P = P + 1
Print P

End Sub

在我的系统(Windows XP + VB6)上,这可以正常工作。所以我得到了第一个输出。但是,我在Windows 7 + VB6上看到了相同的程序,输出结果也不一样。

有人可以解释为什么会这样吗?但是,同样的事情在VB 2008 + Windows 7上运行得很好。我认为按值调用和按引用调用是任何语言/操作系统中的标准参数传递技术。

谢谢!

编辑:cmdOK是一个命令按钮。

1 个答案:

答案 0 :(得分:4)

V = 6
Call AddV(V)

您不会使用此代码观察此行为。这也与Windows版本无关,它不涉及VB6代码执行。但是你的观察很容易解释。您的代码可能如下所示:

V = 6
AddV (V)

换句话说,没有 Call 关键字。现在在VB6中发生了一些非常可怕的事情。括号不再意味着同样的事情了。只有在调用函数时才使用括号来调用Sub。相反,它们会成为表达式的一部分,例如,当您编写Print 4 * (5 + 6)时,您将使用相同类型的括号。它产生V值的副本。被调用的过程更新该副本,它不再影响V变量的值。

虽然这是故意的,但该功能是一个主要的bug工厂,并没有被转移到VB.NET中。括号现在在过程调用中总是意味着相同的东西,无论被调用的过程是Sub还是Function,都可以使用它们。