用CreateObject("myCom.myInterface")也无法创建,请高手指点!
解决方案 »
- scanf("%c",&ch);隐藏输入了0x0A的原因
- 请问大牛门 哪个比较权威的说法 举例下 UDP 是否 需要用IOCP
- 异步通信下,超时有什么有,例如串口通信时?
- 请教大家一个问题,关于远程进程调用:)????谢谢大家
- 有没有哪个工具可以看到*.sys中函数,或者用哪个函数在程序中调用它?
- 如果构造一个这样的类?
- 请问我已经写好了程序,但是我怎样才能让它在没有安装vc的机子上运行能。或者将它和vb一样打包成可执行文件
- 使用MFC获取网页中的文本
- 为什么我的DialogBar 在Create的时候弹出错误“建立空文档失败”求高手帮忙!
- 请告诉我怎样在chtmlview 中保存WEB页的内容
- 为什么总是说内存出错?
- 关于一台server和多台client之间通信的问题
为什么?
> 为什么?因为VB需要调用IDispatch中的GetIDsOfNames方法来得到这个组件的函数列表,要调用IDispatch中的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接口改成我所需要的对象接口就可以?
也许你要做的是聚合....把对IDispatch的QueryInterface调用传给你内部的XMLDocument的instance.....
可以的,但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;
};
我想应该不会吧。
目前我找到了部分问题,(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函数上还有什么猫腻吗?
请高手们帮助!!!
为了让VC中的写的东西到VB,SCRIPT等中使用,你必须对所调用的方法中的参数加以限制,也就是参数类型必须是automation中所规定的
SafeArray好象成员类型要相同,VARIANT类型行不行? 怎么实现呢?
struct INFO
{
WORD Type;
BYTE Month;
BYTE BoardID;
};