唉,真的是个简单问题,我才发出来就发现 msdn 上写着:
Note Visual Basic does not implement derived classes or interfaces.
请高人们来发表一下意见吧,在这种情况下,一般应该怎么做呢,呜呜呜。前20名发表看法的,up,gz的都有分,分数正比于发表的时间和质量,呵呵。把帖子删除了是不是会扣信誉分,还是用这些分数结交些 COM 高人的好。
Note Visual Basic does not implement derived classes or interfaces.
请高人们来发表一下意见吧,在这种情况下,一般应该怎么做呢,呜呜呜。前20名发表看法的,up,gz的都有分,分数正比于发表的时间和质量,呵呵。把帖子删除了是不是会扣信誉分,还是用这些分数结交些 COM 高人的好。
VB 可以QI, 象:
Dim A As IA , B As IB
Set A = New OA
Set B = A ' 将调用 QI
[object,uuid(),dual]
interface B : IDispatch
{
[id(1),propget]HRESULT base( [out,retval]A* pVal );
[id(2)]HRESULT mothod2();
};
VB不熟,干吗用VB
VC也不难呀
我知道 VC 不难,我 VB 虽然不熟嘛但大概还是知道的,呵呵。VC 里有很多的东西不好用的, 象 SAFEARRAY , dispinterface ,即使是 dual 的接口, 象这样的函数 fun( vOpt , vOpt , vOpt , vOpt , vOpt , vOpt , vOpt , vOpt , vOpt , vOpt ..... ) 写的会让人发疯,呵呵,说笑的,我只有看到过 M$ 有这样的接口定义。
最主要的问题是程序的主体是用 VB 写成的,为了使用以前的东西,我必须使用一些不适于在 VC 中使用的东西,没有办法,这是命啊。
在vb中implement没试过。
可以贴段代码出来吗?
关注
msdn上写了VB 不能实现 不是从 IUnknown , IDispatch 派生的接口,任何使用了 singed char , unsigned short , unsigned long 等类型的接口。至于代码,你可以就用我最顶上贴出来的试试,加上 uuid 就是完整的定义了,肯定是不行的,我都试过 N ( N>10 ) 次了。不管你 VB 写:Implements A \n Implements B 还是 Implements B 还是别的什么的,只要 Implements B,肯定出错啊。
idl 大概为:imports....[ uuid( ... ) , version(1.0) ]
library test
{importlib.... [object,uuid( ... ),dual]
interface A : IDispatch
{
[id(1)]HRESULT Method1();
};
[object,uuid( ... ),dual]
interface B : A
{
[id(2)]HRESULT Method2();
};
}; 我想我可以把接口这样定义,以下有几种方案,大家给我提提意见,发表自己的看法,大家想想如果自己遇到这种情况会怎么办:
** 注 , 以下几点不可改变,这是上天的安排
# 必须能够用 VB 实现。
# 必须是 dual 的接口,因为要在脚本中使用。其一:把 interface B 改为从 IDipatch 派生,在 VB 中 Implements A ,Implements B , 用是能用, 不过好像不大方便啊,也不合逻辑。其二:改写 interface B 为:
[object,uuid(...),dual]
interface B : IDispatch
{
[propget,id(1)]HRESULT baseObj( [out,retval]A** pVal );
[id(2)]HRESULT Method2();
};
然后在 VB 中 Implements A , Implements B , 用是能用,也比上面的方便些,但好像也不是很好, A , B 之间确实是存在派生的关系的 B is A。其三:改写 interface B 为:
[object,uuid( ... ) , dual]
interface B : IDispatch
{
[id(1)]HRESULT Method1();
[id(2)]HRESULT Method2();
};
然后再 Implements A , Implements B , 改成这样的话,好像要稍微舒服一点,用VB/VC实现都比较的简单,不过写起程序来要稍微麻烦一点,因为 A 中大概有20个左右的方法/属性,VC中当然简单,跟原始的定义相比实现起来也差不多,不过 VB 里满繁的,当然也不是很繁的,不过要写:
Public Sub B_Method1()
Call A_Method1
End Sub
看起来不是很舒服。我觉得好像是第三种做法要舒服一些,大家觉得怎么样呢,我看 M$ 的MSHTML.TLB 好像就是这样做的,唉,VB还是不舒服啊。
Option Explicit
Public Sub firstmethod()
MsgBox "first"
End Sub
'second(second.cls)
Option Explicit
Implements firstPrivate Sub first_firstmethod()
MsgBox "first_in_second"
End Sub
Public Sub secondmethod()
MsgBox "second"
End Sub'class1(class1.cls)
Option Explicit
Implements second
Implements firstPrivate Sub second_secondmethod()
MsgBox "second_in_class1"
End SubPrivate Sub first_firstmethod()
MsgBox "first_in_class1"
End Sub
'from1(form1.frm)
Private Sub Command1_Click()
Dim mcls As Class1
Dim mfirst As first
Dim msecond As second
Set mcls = New Class1
Set mfirst = mcls
mfirst.firstmethod
Set msecond = mcls
msecond.secondmethod
Set mcls = Nothing
Set msecond = New second
Set mfirst = msecond
mfirst.firstmethod
Set msecond = Nothing
End Sub用vc实现接口也是一样得
请问你的是 second 派生于 first 吗?如果是的话,我试了一下好像不行嘛。
如果 first 和 second 都派生于 IDispatch 或者是 IUnknown 我知道是可以的.
如果用alt的话,在second中implement first,其余和vb是一样的
要么你做一个小的示例发给我,我来帮你试一下。 [email protected]
[object,uuid(),dual]
interface _first : IDispatch
{
[id()]HRESULT firstmethod();
};
[object,uuid(),dual]
interface _second : IDispatch
{
[id()]HRESULT secondmethod();
};
[uuid()]
coclass first
{
[default]interface _first;
};
[uuid()]
coclass second
{
[default]interface _second;
interface _first;
};_first , _second 都是从 IDispatch 派生的,而不是 _second 派生于 _first,再次感谢。[email protected] ,以后多多联系
两个都写了,快给分,赫赫
只要是COM/CORBA有关的,发到这儿偶都不会删,放心吧,不过有没人回答就靠你的运气啦