在VB6中,如何调用需要指向对象的指针的COM对象?

时间:2009-06-04 22:33:24

标签: com vb6 interop

我在使用可见的.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. Dim项目为SimpleMember(没有区别) 2. simple.Add(ObjPtr(item)) - 语法错误 3. simple.Add(ByRef item) - 语法错误

基本上,运行时错误与我的错误相同 simple.AMethodThatIHaventWritten()

此外,如果我在VB6环境中浏览引用,则可以很好地定义Add方法:

Sub Add(成员为SimpleMember)

2 个答案:

答案 0 :(得分:2)

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

simple.add member

而不是

simple.add(member)

如果我将其更改为函数(即返回值而不是void),则必须使用大括号

这似乎有效

答案 1 :(得分:0)

(可能)现在主要用C#,Javascript等编码的开发者所做的前3个VB6编码错误是: -

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