【发布时间】: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)
【问题讨论】: