2009-06-04 29 views
2

我遇到了COM组件可见的问题,并且调用了VB6中的某些方法。 我发现的是,如果参数是明确定义的类型(例如字符串),则调用工作正常。如果它们是更高级别的对象,则会引发运行时错误“438”,表明属性或方法不存在。我怀疑这是一个在呼叫中拥有正确签名的问题,但我无法看到如何正确执行此操作。在VB6中,如何调用需要指向对象的指针的COM对象?

我相信我已经在.NET方面做了一切正确的事情(ComVisible,公共接口等,甚至把它放在一个简单的例子中)。从类型库查看器的输出

看,我有以下几点:

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

确定。所以我在我的ISimple接口中有两种方法。一个需要一个ISimpleMember(Add),而另一个则返回一个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(项)) - 语法错误 3. simple.Add(为ByRef项目) - 语法错误

基本上,运行时间错误是一样的,如果我有 simple.AMethodThatIHaventWritten()

还有,如果我浏览在VB6环境引用,Add方法是明确界定:

减少添加(成员作为SimpleMember)

回答

2

我发现我相信答案。这很简单: 当调用子例程时,我不应该把名字放在大括号中。通话应该是:

simple.add member 

而不是

simple.add(member) 

如果我将其更改为一个功能(即返回一个值,而不是无效)括号是必要的

这似乎是工作

+0

您是否从下面的代码中看到了这个想法? :-) – ichiban 2009-06-04 22:56:05

0

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

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