我在使用可见的.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)
答案 0 :(得分:2)
我找到了我相信的答案。这很简单: 在调用SubRoutine时,我不应该将名称放在大括号中。电话应该是:
simple.add member
而不是
simple.add(member)
如果我将其更改为函数(即返回值而不是void),则必须使用大括号
这似乎有效
答案 1 :(得分:0)
(可能)现在主要用C#,Javascript等编码的开发者所做的前3个VB6编码错误是: -
;
放在行尾。它很容易发现它的语法错误并选择了编译器。Then
放在If
条件表达式的另一侧。再次出现语法错误。