Windows 参数通过VB6+;视窗7

Windows 参数通过VB6+;视窗7,windows,vb6,parameter-passing,byref,Windows,Vb6,Parameter Passing,Byref,我已经使用VB6很多年了,但是我遇到了一些非常奇怪的事情,我自己也无法证实这个结果。所以我想知道下面代码的输出是否 七, 七, 或 七, 六, 代码如下: 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+V

我已经使用VB6很多年了,但是我遇到了一些非常奇怪的事情,我自己也无法证实这个结果。所以我想知道下面代码的输出是否

七,

七,

七,

六,

代码如下:

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)上,这项功能正常工作。所以我得到了第一个输出。然而,我在Windows7+VB6上看到了相同的程序,并且输出不一样

有人能解释一下为什么会这样吗?然而,同样的事情在VB2008+Windows7上运行良好。我认为按值调用和按引用调用是任何语言/操作系统中的标准参数传递技术

谢谢

编辑:cmdOK是一个命令按钮

V = 6
Call AddV(V)
您不会使用此代码观察此行为。这也与Windows版本无关,它与VB6代码的执行无关。然而,对你的观察有一个简单的解释。您的代码可能如下所示:

V = 6
AddV (V)
换句话说,没有呼叫关键字。现在VB6中发生了一些非常可怕的事情。括号的意思不再是同一件事了。只有在调用函数时,才可以使用括号来调用子函数。相反,它们会成为表达式的一部分,与编写
print4*(5+6)
时使用的括号相同。它生成V值的副本。被调用的过程更新该副本,它不再影响V变量的值

虽然这是有意的,但该特性是一个主要的错误工厂,没有被带入VB.NET。现在,括号在过程调用中的含义始终相同,无论被调用的过程是子过程还是函数,都可以使用括号

您不会使用此代码观察此行为。这也与Windows版本无关,它与VB6代码的执行无关。然而,对你的观察有一个简单的解释。您的代码可能如下所示:

V = 6
AddV (V)
换句话说,没有呼叫关键字。现在VB6中发生了一些非常可怕的事情。括号的意思不再是同一件事了。只有在调用函数时,才可以使用括号来调用子函数。相反,它们会成为表达式的一部分,与编写
print4*(5+6)
时使用的括号相同。它生成V值的副本。被调用的过程更新该副本,它不再影响V变量的值


虽然这是有意的,但该特性是一个主要的错误工厂,没有被带入VB.NET。现在,括号在过程调用中的含义始终相同,无论调用的过程是子过程还是函数,都可以使用括号。

感谢您的输入。。。请注意,问题中的代码正是我从Windows XP上的VB程序中提取的代码。对我来说,它产生“预期”输出(这是第一个)。您是否在使用VB6的Windows 7上尝试过此代码?如果你做了,结果是什么?当然不是。这将需要一个命令从Prez让我擦我的Win8机器和安装VB6。对于许多VB6程序员陷入的陷阱,我给了您一个很好的解释,很明显,我认为您只是另一个受害者。给我看一张截图。我必须同意,这是一个公然的偏离主题的.Net传教活动(想想“被僵尸咬了”)。这与操作系统版本无关。嗯,不,为什么在VB2008中不会发生这种情况是问题中明确的问题。感谢您的输入。。。请注意,问题中的代码正是我从Windows XP上的VB程序中提取的代码。对我来说,它产生“预期”输出(这是第一个)。您是否在使用VB6的Windows 7上尝试过此代码?如果你做了,结果是什么?当然不是。这将需要一个命令从Prez让我擦我的Win8机器和安装VB6。对于许多VB6程序员陷入的陷阱,我给了您一个很好的解释,很明显,我认为您只是另一个受害者。给我看一张截图。我必须同意,这是一个公然的偏离主题的.Net传教活动(想想“被僵尸咬了”)。这与操作系统版本无关。嗯,不,为什么在VB2008中不会发生这种情况是问题中明确的问题。我在VB6+XP和VB6+Win7(相同的exe)上得到了相同的结果(7)。根据Hans的描述,如果我在运行时删除了Call关键字,那么我在两个操作系统中都会看到预期的结果(7 6)。我在VB6+XP和VB6+Win7上得到相同的结果(7 7)(相同的exe)。根据Hans的描述,如果我在运行它时删除了Call关键字,那么在两个操作系统中都会看到预期的结果(76)。