将右值作为ByRef参数传递给VB6?

马特·米尔斯(Matt Mills)

背景:我有一组共享公共“接口”的VB6 DLL。无论本地安装了哪个版本,都可以通过COM互操作调用该接口的成员(从VB.Net代码,我怀疑这可能很重要)。我今天注意到,调用之一将[我理解为]右值(以下称为“右值”)传递给VB6函数,该函数没有将该特定参数定义为ByVal

示例代码:

VB6:

Public Function VB6Function(input As String) As String
    ' Do interesting things with input
End Function

VB.Net:

' get an instance of the VB6 class and pass our trimmed localString to it
result = vb6Instance.VB6Function(localString.Trim())
' Do interesting things with localString

我尚未注意到VB6代码的实例更改的值input,但是我也没有详尽搜索不同的DLL实现(有数百种)。

如果VB6Function更改inputwheninput为“ rvalue”的值会发生什么为此,为什么在传递“右值”时此方法调用不会简单地出错?

塞尔格

如果输入为“右值”时VB6Function确实更改了输入的值,将会发生什么?

没有。或者说,没什么有趣的。

当被调用函数更改其参数的值时,无论该参数由byval还是byref提供,对该函数的内部都没有影响重要的是存在某种类型的变量,因此可以对其进行操作。

为此,为什么在传递“右值”时此方法调用不会简单地出错?

为什么会出错?传递的参数是正确的类型(字符串),这很重要。

在VB中没有右值的概念。
当您将所谓的右值传递给通过引用接受某些内容的方法时,编译器会自动将引用传递到右值实际驻留临时位置该方法获取其值byref,调用者不在乎指针。

localString.Trim()分配并返回一个字符串。它有一个地址,可以传递。您的代码没有显式捕获该地址,但是编译器将其传递给VB6Functionbyref没有问题如果VB6Function更改该值,它将更改该临时位置所指向的内容,这没有明显的区别,因为它将在调用后以任何一种方式销毁。

至于为什么有些人可能更喜欢在VBA中通过byref接收字符串,这是特别避免在每次调用函数时都复制整个字符串。在VB.NET中,这不是问题,因为那里的字符串是不可变的,因此可以按字节传递而不进行复制,但是在VBA中则不是这样,因此出于调用的目的,必须克隆一个byval字符串。人们通过指定byref来避免这种情况,尽管从技术上讲,它们使他们有能力弄乱传递的变量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将方法作为参数传递给PHP

来自分类Dev

将矩阵作为参数传递给函数

来自分类Dev

将splat传递给nil作为参数

来自分类Dev

将函数作为参数传递给操作

来自分类Dev

在vb6下将我作为CallbyName函数的参数传递给我怎么了?

来自分类Dev

将右值参数传递给非常量左值引用的参数

来自分类Dev

将数组作为参数传递给printf

来自分类Dev

将Document作为参数传递给xslt

来自分类Dev

将函数作为参数传递给函数

来自分类Dev

将值作为参数传递给规则

来自分类Dev

将PSCredential作为参数传递给脚本

来自分类Dev

将函数作为参数传递给模板返回值

来自分类Dev

VB6模块将记录集传递给表单

来自分类Dev

将值列表作为参数传递给R中的函数

来自分类Dev

如何在VB6中将空值传递给函数?

来自分类Dev

将流作为参数传递给作业

来自分类Dev

将输入元素的值作为参数传递给viewmodel函数

来自分类Dev

将VB函数回调作为参数传递给.NET

来自分类Dev

传递输入参数作为右值引用?

来自分类Dev

从VB.Net将文本值作为参数传递给Crystal Report公式字段时出错

来自分类Dev

返回作为参数传递给函数的右值引用

来自分类Dev

反应钩子。将值作为参数传递给useReducer()

来自分类Dev

将绑定值作为参数传递给SwiftUI 2视图

来自分类Dev

将未定义的值作为参数传递给字典

来自分类Dev

如何使用VB6将数组的值传递给另一个数组

来自分类Dev

将空值作为参数传递给DataSet

来自分类Dev

将Delphi记录类型传递给VB6 DLL

来自分类Dev

(VB) 将变量传递给报告参数

来自分类Dev

仅将非 None 值作为参数传递给函数