使用VB6 + Windows 7传递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上工作得很好。我认为按值调用和按引用调用是任何语言/操作系统的标准parameter passing技术。

谢谢!

编辑:cmdOK是一个命令button。

 V = 6 Call AddV(V) 

你不会用这个代码来观察这个行为。 这与Windows版本无关,它不涉及VB6代码执行。 然而,你的观察有一个简单的解释。 你的代码可能看起来像这样:

 V = 6 AddV (V) 

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

虽然这是故意的,但这个功能是一个主要的bug工厂,并没有被带入VB.NET。 在过程调用中括号现在总是意味着相同的事情,并且不管被调用的过程是Sub还是Function,都使用它们。