【问题标题】:Parameter passing ByRef with VB6 + Windows 7使用 VB6 + Windows 7 传递 ByRef 的参数
【发布时间】:2013-07-03 16:56:35
【问题描述】:

我已经使用 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 是一个命令按钮。

【问题讨论】:

  • 我在 VB6+XP 和 VB6+Win7(相同的 exe)上得到相同的结果 (7 7)。根据 Hans 的描述,如果我在删除 Call 关键字的情况下运行它,那么我会在两个操作系统中看到 (7 6) 的预期结果。

标签: windows vb6 parameter-passing byref


【解决方案1】:
V = 6
Call AddV(V)

您不会在这段代码中观察到这种行为。这也与 Windows 版本无关,它与 VB6 代码执行无关。但是,对于您的观察,有一个简单的解释。您的代码可能如下所示:

V = 6
AddV (V)

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

虽然这是故意的,但该功能是一个主要的错误工厂,并没有被带到 VB.NET 中。现在,括号在过程调用中的含义始终相同,无论被调用的过程是 Sub 还是 Function,都可以使用括号。

【讨论】:

  • 感谢您的输入...请注意,我在问题中的代码与我从 Windows XP 上的 VB 程序中获取的代码完全相同。对我来说,它产生“预期”输出(这是第一个)。您是否在带有 VB6 的 Windows 7 上尝试过此代码?如果你这样做了,结果如何?
  • 当然不是。 Prez 会下令让我擦拭我的 Win8 机器并安装 VB6。对于许多 VB6 程序员陷入的陷阱,我给了你一个很好的解释,显然我认为你只是另一个受害者。给我看一张截图。
  • 公然离题的 .Net 传教(想想“被僵尸咬”)我不得不同意。这与操作系统版本无关。
  • 嗯,不,为什么在 VB2008 中不会发生这种情况是问题中明确提出的问题。
猜你喜欢
  • 2020-09-04
  • 1970-01-01
  • 2011-12-11
  • 2018-07-16
  • 2022-01-04
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多