【问题标题】:In VB6, how do I call a COM object requiring a pointer to an object?在 VB6 中,如何调用需要指向对象的指针的 COM 对象?
【发布时间】:2010-10-31 12:11:04
【问题描述】:

我在使用 com 可见的 .NET 程序集时遇到问题,并且从 VB6 调用某些方法。 我发现如果参数是明确定义的类型(例如字符串),调用工作正常。如果它们是更高级别的对象,则会引发运行时错误“438”,表明该属性或方法不存在。我怀疑这是在通话中具有正确签名的问题,但我看不出如何正确执行此操作。

我相信我在 .NET 方面所做的一切都是正确的(ComVisible、公共接口等,甚至可以简化为一个足够简单的案例)。

查看 typelib 查看器的输出,我有以下内容:

dispinterface ISimple {
properties:
methods:
    [id(0x60020000)]
    void Add([in] ISimpleMember* member);
    [id(0x60020001)]
    ISimpleMember* Create();
};

好的。所以我的 ISimple 接口中有 2 个方法。一个接受一个 ISimpleMember(添加),而另一个返回一个 ISimpleMember。

VB中对应的代码如下:

Dim item As ISimpleMember
Dim simple As simple
Set item = New SimpleMember
item.S1 = "Hello"
item.S2 = "World"
Set simple = New simple
simple.Add (item)           <---- This raised the run time error 438
Set item = simple.Create    <---- This works fine, returning me an ISimpleMember

我尝试了几件事: 1. 将项目调暗为 SimpleMember(没有区别) 2. simple.Add(ObjPtr(item)) - 语法错误 3. simple.Add(ByRef item) - 语法错误

基本上,运行时错误与我一样 simple.AMethodThatIHaventWritten()

另外,如果我在 VB6 环境中浏览引用,则 Add 方法定义明确:

子添加(成员为 SimpleMember)

【问题讨论】:

    标签: com vb6 interop


    【解决方案1】:

    我找到了我相信的答案。这很简单: 调用 SubRoutine 时,我不应该将名称放在大括号中。电话应该是:

    simple.add member
    

    而不是

    simple.add(member)
    

    如果我将它更改为一个函数(即返回一个值而不是 void),则大括号是必要的

    这似乎有效

    【讨论】:

    • 这个错误应该很容易发现。 IDE 将通过在您输入的值表达式前面插入一个空格来尝试告诉您您所要求的内容。对于函数调用,没有这样的空间(如果你输入一个,它会被删除)。微妙的?不适用于使用 VB6 编写超过一天左右的任何人。
    【解决方案2】:

    (可能)现在主要使用 C#、Javascript 等进行编码的开发人员所犯的前 3 个 VB6 编码错误是:-

    1. ; 放在行尾。它是一个语法错误,很容易被编译器发现并识别出来。
    2. 没有将Then 放在If 条件表达式的另一侧。又是一个语法错误。
    3. 调用方法而不检索值,但使用 () 括起参数列表。对于多个参数,这是一个语法错误,很容易找到。只有一个参数, ( ) 的使用被解释为一个表达式。它是作为参数传递的 ( ) 表达式的结果。当被调用者期望 ByRef 时,这会导致问题。

    【讨论】:

      猜你喜欢
      • 2019-10-21
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多