社区
ATL
帖子详情
--请问怎样用VC写COM的接口,才可以使之在VB或脚本中使用???
waywin
2002-03-18 02:47:51
近日用VC写了个包装了XMLDOM的COM,编译成DLL后,注册成功,在注册表里可以查到,UnRegister也没问题。在VC里更是使用正确无误,可是在VB里却没法创建对象,连VB->工程->“引用”里也没有看到。
用VC的工具OLEView也无法观看.告知"LoadTypeLib Failed",请问问题可能出在哪里?
...全文
101
15
打赏
收藏
--请问怎样用VC写COM的接口,才可以使之在VB或脚本中使用???
近日用VC写了个包装了XMLDOM的COM,编译成DLL后,注册成功,在注册表里可以查到,UnRegister也没问题。在VC里更是使用正确无误,可是在VB里却没法创建对象,连VB->工程->“引用”里也没有看到。 用VC的工具OLEView也无法观看.告知"LoadTypeLib Failed",请问问题可能出在哪里?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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")也无法创建,请高手指点!
WINCC
VC
/
VB
脚本
解密软件
WINCC
VC
/
VB
脚本
解密软件 WINCC
VC
/
VB
脚本
解密软件
vc
实现的
vb
脚本
编辑器
vc
实现的
vb
脚本
编辑器 支持关键字的高亮显示 希望对初学者有所帮助
用
VC
#.NET+OpenGL开发交互式CAD系统
本课程用
VC
#.NET结合OpenGL,从无到有开发一个功能较完整的小型交互式CAD系统。 作者有交互式CAD系统、动态几何系统开发经验。出版过交互式CAD系统开发方面的图书。 课程先讲准备知识,然后讲整个系统的开发思路和...
VB
6-2D游戏引擎源码
欢迎你加入
VB
6游戏开发
中
来,也很感谢你能够
使用
这个尚未成熟的Alpha游戏引擎 -------------------------------------------------------------------------- 一、目录 1、EngineSourceCodes是引擎源代码,DD_...
JsScript
Vb
Script
脚本
解析控件
10.利用强大的
VB
Script
脚本
技术可以实现数据库
接口
,轻松将程序
中
的变量
写
入第三方的数据库
中
如果您正在被流程设计
中
繁杂的逻辑判断、为第三方提供数据
接口
而烦恼,如果你想在您的产品
中
嵌入 功能强大、高度灵活...
ATL
3,245
社区成员
48,539
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章