一个可能是简单问题,但我真的不知道,顺便散分,并向各位大虾问好

LLnju 2002-03-25 10:38:46
我一直是用ATL的,最近发现VB满好的,打算也用用VB写写东西,但我发现这样一个在ATL中很简单的问题,到VB中竟然好像不行,我想肯定是我的使用上有问题,大家帮我看看应该怎么做,up,gz 有分。

我定义了这样的接口:
[object,uuid(),dual]interface A : IDispatch { [id(1)]HRESULT mothod1();};
[object,uuid(),dual]interface B : A { [id(2)]HRESULT mothod2(); };

我试图在VB中 Implements B , 但是VB 报:
bad interface for implements , interface derived from another pure interface with non-restricted methods

是不是VB不能实现这样的接口,还是应该用什么别的办法啊,一般来说各位大虾遇到这种情况是怎么办的。

注:不要ATL实现方式,我知道的,因为一些特殊原因我要用VB实现,苦啊。
...全文
28 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
LLnju 2002-03-30
  • 打赏
  • 举报
回复
呵呵,版主,谢了。其实,我是想自己把帖子删了,怕扣信誉分就没有删掉,干脆到这个地方送分来了。
fantong 2002-03-30
  • 打赏
  • 举报
回复
up,gz
两个都写了,快给分,赫赫
只要是COM/CORBA有关的,发到这儿偶都不会删,放心吧,不过有没人回答就靠你的运气啦
LLnju 2002-03-29
  • 打赏
  • 举报
回复
up
LLnju 2002-03-28
  • 打赏
  • 举报
回复
在等两天就结帐
LLnju 2002-03-27
  • 打赏
  • 举报
回复
谢谢tonkeycn(dog)先, 上面的 VB 代码肯定没有问题,但是你可能看错了我的要求,你的 VB 程序对应的 idl 说明为:
[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,再次感谢。LLnju79@hotmail.com ,以后多多联系
tonkeycn 2002-03-27
  • 打赏
  • 举报
回复
同名的yahoomessage tonkeycn,可以直接找我。^_^
tonkeycn 2002-03-27
  • 打赏
  • 举报
回复
上面这段vb代码应该是没有问题的,second implement first,然后在class1中implement second 不就可以了吗?
如果用alt的话,在second中implement first,其余和vb是一样的
要么你做一个小的示例发给我,我来帮你试一下。 mzl@visda.com
LLnju 2002-03-27
  • 打赏
  • 举报
回复
to tonkeycn(dog):
请问你的是 second 派生于 first 吗?如果是的话,我试了一下好像不行嘛。
如果 first 和 second 都派生于 IDispatch 或者是 IUnknown 我知道是可以的.
tonkeycn 2002-03-27
  • 打赏
  • 举报
回复
'first(first.cls)
Option Explicit
Public Sub firstmethod()
MsgBox "first"
End Sub


'second(second.cls)
Option Explicit
Implements first

Private Sub first_firstmethod()
MsgBox "first_in_second"
End Sub
Public Sub secondmethod()
MsgBox "second"
End Sub

'class1(class1.cls)
Option Explicit
Implements second
Implements first

Private Sub second_secondmethod()
MsgBox "second_in_class1"
End Sub

Private 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实现接口也是一样得


tonkeycn 2002-03-27
  • 打赏
  • 举报
回复
是这样的。
现在还想不出比较好的解决方法。
关注
tonkeycn 2002-03-26
  • 打赏
  • 举报
回复
是再同一个组件里实现两个接口?
LLnju 2002-03-26
  • 打赏
  • 举报
回复
VC当然可以用 SAFEARRAY, 不过比较麻烦的,象 Array( Array( "a" , 1 , obj123 , Array( 1 , 2 , 3 ) ) , Array(....) ) 把人都要搞的崩溃了,你说我把它改成 struct { string , long , struct { long , long , long }; }; 我用起来是方便了,可是别人不依啊。另外调用 dispinterface 每次都 getidofnames , invoke 也不是个办法啊( 没有tlb, 这是上天的安排 )。
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还是不舒服啊。
LLnju 2002-03-26
  • 打赏
  • 举报
回复
呵呵,不是的,一个组件实现两个接口我是知道的。我是说如何用 VB 实现不是由 IUnknown , IDispatch 直接派生而来的接口 或者 怎么样模拟这种实现方式。
LLnju 2002-03-25
  • 打赏
  • 举报
回复
to arxing(阿行), 我知道啊,用ATL是比较的方便,但有时候用用VB也不错啊。
VB 可以QI, 象:
Dim A As IA , B As IB
Set A = New OA
Set B = A ' 将调用 QI
arxing 2002-03-25
  • 打赏
  • 举报
回复
不大可能实现吧。干吗要用VB呢,它不支持QueryInterface,也不支持继承。
tonkeycn 2002-03-25
  • 打赏
  • 举报
回复
关注
LLnju 2002-03-25
  • 打赏
  • 举报
回复
唉,真的是个简单问题,我才发出来就发现 msdn 上写着:
Note Visual Basic does not implement derived classes or interfaces.
请高人们来发表一下意见吧,在这种情况下,一般应该怎么做呢,呜呜呜。

前20名发表看法的,up,gz的都有分,分数正比于发表的时间和质量,呵呵。把帖子删除了是不是会扣信誉分,还是用这些分数结交些 COM 高人的好。


tonkeycn 2002-03-25
  • 打赏
  • 举报
回复
VC是可以用SAFEARRAY的。应该说vb能作的vc肯定可以做
在vb中implement没试过。
可以贴段代码出来吗?
关注
LLnju 2002-03-25
  • 打赏
  • 举报
回复
to wei97081116(韦小宝):
我知道 VC 不难,我 VB 虽然不熟嘛但大概还是知道的,呵呵。VC 里有很多的东西不好用的, 象 SAFEARRAY , dispinterface ,即使是 dual 的接口, 象这样的函数 fun( vOpt , vOpt , vOpt , vOpt , vOpt , vOpt , vOpt , vOpt , vOpt , vOpt ..... ) 写的会让人发疯,呵呵,说笑的,我只有看到过 M$ 有这样的接口定义。
最主要的问题是程序的主体是用 VB 写成的,为了使用以前的东西,我必须使用一些不适于在 VC 中使用的东西,没有办法,这是命啊。
WQ 2002-03-25
  • 打赏
  • 举报
回复
upupupupupupupupupupup
VB不熟,干吗用VB
VC也不难呀
加载更多回复(2)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧