【问题标题】:"Invalid procedure call or argument" when calling a sub without parenthesing one parameter“无效的过程调用或参数”调用子时没有括号一个参数
【发布时间】:2018-03-29 01:51:07
【问题描述】:

我用这段代码 (VB.NET) 编写了一个 COM-Visible DLL

' .NET Class with implementing an interface to make it visible
Public Class VisibleClass
    Public Sub callableSub(ByVal names As ACustomCollection, _
                           Optional ByVal doSomething As Boolean = True) _
        Implements IVisibleClass.visibleCallableSub
        Me.doSub(names.process, doSomething)
    End Sub
End Class

' Interface for COM-visibility
<InterfaceType(ComInterfaceType.InterfaceIsDual)> _
Public Interface IVisibleClass
    Sub visibleCallableSub(ByVal names As ACustomCollection, _
                           Optional ByVal doSomething As Boolean = True)
End Interface

这也是创建对象并调用其方法的 ASP 网页:

' stuff.asp
Dim visibleObject
Dim aCustomCollection
Set visibleObject = getNewVisibleInstance (aCollection)
Set aCustomCollection = createEmptyCollection

aCustomCollection.add someStuffs
aCustomCollection.add otherStuffs
aCustomCollection.add lastStuffs

' These calls work:
visibleObject.visibleCallableSub(aCustomCollection)
visibleObject.visibleCallableSub(aCustomCollection), False
visibleObject.visibleCallableSub(aCustomCollection), True
Call document.fetchPropertyCollection ((properties), false)

' These ones don't:
visibleObject.visibleCallableSub someparams
visibleObject.visibleCallableSub someparams, False
visibleObject.visibleCallableSub someparams, True
Call document.fetchPropertyCollection (properties, false)

非工作调用会产生以下错误:

无效的过程调用或参数

我不明白为什么我必须加上括号。我知道这告诉解释器在传递主题之前制作副本,但不是为什么它是强制性的。

注意:这与one 的问题相同,即关于在需要副本的地方传递引用。然而,这个问题被告知是由于“传递另一个函数的返回值”,这使得通过研究更难达到。

【问题讨论】:

标签: vb.net vbscript asp-classic pass-by-value comvisible


【解决方案1】:

如果被调用的 Sub/Function 要求一个 value(ByValue),则不能传递引用('pointer')。将 'make a copy' 括号括在参数周围可确保被调用的 Sub/Function 获得

为了表达你的意图,你应该写:

visibleObject.visibleCallableSub (aCustomCollection), False

参照。 same error, parentheses, adventures.

【讨论】:

  • 我更新了两行,添加了Call...Call 强制复制,对吗?如果是这样,为什么即使在这种情况下我也需要加上括号?
  • (愚蠢的)Call关键字只允许您使用参数列表括号;它复制。按照第二个链接了解不同类型的 () 及其功能。
  • “(傻)调用关键字” - 为什么傻? Call 语句非常有用,它使在代码中识别过程变得轻而易举,并允许使用括号调用 Sub 过程。多年来一直使用它并且从未遇到过问题,它之所以愚蠢的唯一原因是如果倾向于编写只有您可以理解的草率代码。我猜每个人都有自己的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多