旧版Visual Basic代码中的隐式ByRef

dai*_*ign 2 vb6 basic reverse-engineering pass-by-reference byref

我必须从旧版的Visual Basic软件中复制算法,而关于代码的一件事我不理解。

看来作者已经使用某种方式隐式地通过引用传递简单的数据类型,例如整数。我第一次认为这可能是原始软件中的错误,但第三次出现后,它似乎是故意的。

我无法运行和调试原始(VB6或更低版本)代码。并且在我尝试重现该行为(使用VB.NET)的每个简单代码示例中,除非明确使用ByRef,否则它始终按值传递。

我举了一个例子:

Option Explicit

Module VBModule
    Public Sub Calculate(value)
        value = value + 1
    End Sub

    Function Starter()
        Dim value%
        Call Calculate(value)
        If value > 0 Then
            Console.WriteLine("Success")
        End If
        Console.WriteLine(value)
    End Function

    Sub Main()
        Call Starter()
    End Sub
End Module
Run Code Online (Sandbox Code Playgroud)

该代码取决于Sub value更改Calculate以达到“成功”。在原始项目中,如果不起作用,则有数百行代码将无法访问。

所以问题是,有没有办法value在仍然使用整数类型的情况下通过引用传递而不使用ByRef?还是我要完全理解的错误代码?

作者在代码库中的任何地方都没有使用显式的ByRef或ByVal语句。变量使用类型字符声明,但是子例程参数缺少类型声明。我不确定所使用的Visual Basic版本。在主文件中,第一个语句为VERSION 5.00

当我在Visual Studio中打开代码时,参数的类型显示为Object。因此,Visual Studio知道我不知道的东西,或者仅仅是因为参数缺少类型声明。

我还拥有该软件的编译版本,其产生的结果看起来不错。因此,当我完成代码转录后,我至少可以对照原始结果进行检查。

Mar*_*haw 6

默认的参数传递是ByRef。您只需要指定ByVal参数。

至于在Visual Studio中转换为Object的参数的类型,这是因为Visual Basic中的默认类型是“ Variant”,对于所有意图和目的,该类型都映射到System.Object类型。

  • 在VB6中,默认的参数传递是ByRef。 (3认同)