--请问怎样用VC写COM的接口,才可以使之在VB或脚本中使用???

waywin 2002-03-18 02:47:51
近日用VC写了个包装了XMLDOM的COM,编译成DLL后,注册成功,在注册表里可以查到,UnRegister也没问题。在VC里更是使用正确无误,可是在VB里却没法创建对象,连VB->工程->“引用”里也没有看到。
用VC的工具OLEView也无法观看.告知"LoadTypeLib Failed",请问问题可能出在哪里?
...全文
101 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
borz 2002-04-08
  • 打赏
  • 举报
回复
我也是初识COM、一点提示
为了让VC中的写的东西到VB,SCRIPT等中使用,你必须对所调用的方法中的参数加以限制,也就是参数类型必须是automation中所规定的
ye_cl 2002-04-08
  • 打赏
  • 举报
回复
实现了自动化的COM,宿主文件类型为Service(EXE),添加接口函数,把如下结构作为函数参数返回给调用它的客户程序,用什么数据类型呢?
SafeArray好象成员类型要相同,VARIANT类型行不行? 怎么实现呢?
struct INFO
{
WORD Type;
BYTE Month;
BYTE BoardID;
};
waywin 2002-04-05
  • 打赏
  • 举报
回复
kicku你说的对,应该是聚合……
目前我找到了部分问题,(1)DisPatch接口的GetTypeInfoCount,GetTypeInfo我写的有问题,GetIDsOfNames,Invoke。
(2)注册表写的不对,(因为考虑到平台,没有用MFC和ATL,所以注册表得自己写),应该不仅在CLSID子键中,还要在TypeLib子键中,以及组件名写在HKEY_CLASSES_ROOT下,三者通过ProId联系起来。这是为了在脚本中用CreateObject("yourCom")调用

(3) 还有正象LLnju说得那样,我的类型库没有加入工程。:P

经过以上修正后,我的DLL可以成功注册,在VB中“工程->引用”中可以看见,用OLEView已经可以看见所有我希望看到的方法和属性,在VB中可以New这个组件的接口对象,可是在调用方法或者设置属性时,VB程序会出错“自动化错误”,错误号0x80040110,用VC的Error Lookup查错误解释为"类不支持 aggregation (或类对象为远程对象) "。
LLnju,不好意思,因为我希望用户可以完全象用IXMLDOMDocument一样用我的组件,所以我用的真是这种方法,撇开ClassFactroy等的具体实现,实际上我是在创建组件是New一个IXMLDOMDocument,在用户调用相应接口方法时,我调用相应的IXMLDOMDocument接口方法,改写后返回。土是土了点(而且可能有问题)可这也是没有办法的事情,你看看msxml2.lib,该死的W3C没有加入函数库,我能咋办?

看来你是高手啊,谢谢你的提示,我还真不知道“数据类型 不能是 signed char , unsigned short , unsigned long”呢?
请继续提示,我的问题就是以上,而且目前在VC环境下运行无误,可是用VB调用就是不行,难道在Invoke函数上还有什么猫腻吗?
请高手们帮助!!!

iteagle 2002-03-30
  • 打赏
  • 举报
回复
请问双接口是什么?
LLnju 2002-03-25
  • 打赏
  • 举报
回复
VB使用的组件不必是 IDispatch 的,但脚本语言中必须是。注意你使用的数据类型 不能是 signed char , unsigned short , unsigned long 这样的函数不能在 VB 中使用,包含了这些数据类型的接口不能由 VB 实现 但VB 可以使用这样的接口(当然不能使用包含了这些数据类型的函数)。

>>而是某个已经实现双接口的对象(如XMLDocument)继承
可以的,但VB只能使用这样的接口,不能实现,这个我可是用100分买的教训,idl 中象下面的写就行了:
[object,uuid(...),dual]interface IYourInterface : IXMLDocument{};

>>CreateObject("myCom.myInterface")无法创建
这个根是否 IDispatch 接口没有关系,应该是你的progid错了,或者是你的程序没有正确地注册。

根据你上面列出来的情况,你的程序确实没有注册类型库,你用oleview看看你的 dll( exe ), 或者你用 VC 把dll(exe)当作资源打开看看是不是有类型库,你的对象是怎么实现的,难道是用这种最古老的办法:
interface IYourInterface : public IXMLDocument
{
STDMETHOD(method1)() PURE;
};
我想应该不会吧。

kicku 2002-03-22
  • 打赏
  • 举报
回复
>如果我不是直接从Idispatch继承,而是某个已经实现双接口的对象(如XMLDocument)继承,我的IDI是否只需将Idispatch接口改成我所需要的对象接口就可以?

看不太懂你这句话.....COM对象好象不能继承吧.....
也许你要做的是聚合....把对IDispatch的QueryInterface调用传给你内部的XMLDocument的instance.....
waywin 2002-03-21
  • 打赏
  • 举报
回复
谢谢大家,特别是kichu和puppet,我清楚要使VB或脚本中能调用必须从idispatch接口继承,并实现双接口,其实说到底,正象是kichu说的,是为了使用Idispatch的GetIDsOfNames和Invoke函数。
COM提供一个叫CLSIDFromProgID的函数,它根据给出的ProgID查找CLSID。VB或脚本用"CreateObject"调用这个函数,然后Visual Basic调用我们的最熟悉的CoCreateInstanceEx,传送CLSID和请求IDispatch接口,IDispatch::GetIDsOfNames获得与方法或属性的文本名有关的整型ID,也就是双接口定义的IDL文件中的id(1)类似的东东。
而IDispatch::Invoke接收一批参数,所有现行的自动化属性和方法访问都是通过调用IDispatch::Invoke实现的。

以上是小弟对自动化双接口的一些理解,可是我最想问的是,如果我不是直接从Idispatch继承,而是某个已经实现双接口的对象(如XMLDocument)继承,我的IDI是否只需将Idispatch接口改成我所需要的对象接口就可以?

kicku 2002-03-20
  • 打赏
  • 举报
回复
>to flywolfman() :
> 为什么?

因为VB需要调用IDispatch中的GetIDsOfNames方法来得到这个组件的函数列表,要调用IDispatch中的Invoke来调用这个组件里的函数。
Radiumh 2002-03-20
  • 打赏
  • 举报
回复
VB不支持IUnknown接口。
hollysky 2002-03-20
  • 打赏
  • 举报
回复
接口从IDispatch继承而不是从IUnknown
yclyz 2002-03-20
  • 打赏
  • 举报
回复
to flywolfman() :
为什么?
taijizhang 2002-03-19
  • 打赏
  • 举报
回复
看看你的idl有没有问题
flywolfman 2002-03-19
  • 打赏
  • 举报
回复
必须使用双接口实现IDispatch
puppet 2002-03-18
  • 打赏
  • 举报
回复
实现了双接口没有?支不支持IDispatch?我也不是太懂,只是提醒你一下
waywin 2002-03-18
  • 打赏
  • 举报
回复
用CreateObject("myCom.myInterface")也无法创建,请高手指点!

3,245

社区成员

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

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