错误号:-2147319779(8002801d)
使用ATL开发了一个IHWD.DLL,该DLL中包含6个COM组件,所有的组件均支持双接口,即接口均从IDispatch派生。
所有的接口均有dual,oleautomation属性(出接口除外) 在VC中调用没有问题。 
在VB中通过添加引用使用其自定义接口,调用正常,代码如下: 
dim x as new IHWDLib.SerialPort 
x.Cancel 问题是在VB中通过如下方式调用会报错,这种方式使用的应该是IDispatch接口,即所谓的后绑定。
dim x as Object 
set x = CreateObject("IHWD.SerialPort") 
x.Cancel '此行报错
错误如下图所示: 
http://202.102.234.68:5679/error.png在网页中通过 <object>标签嵌入SerialPort并通过javascript来调用也不成功,始终报错为“对象不支持此属性或方法”。 如何解决? 
已经测试过如下解决方法: 
添加访问注册表HKCR键的全部访问权限 
注册scrrun.dll和vbscript.dll
重新安装脚本解释引擎5.6
Set x=CreateObject("Excel.Application"):x.Quit 运行正常
IE版本为6.0和7.0环境均有此问题
xp sp2和xp sp3均有此问题检查进程空间,发现程序运行时,IHWD.DLL以及其所依赖的PCOMM.DLL已经装载到进程空间。使用单步调试,发现类厂创建成功,而且类厂的CreateInstance函数也返回了S_OK,再跟下去就是汇编代码了,看不懂。不知道会是因为什么问题引起的?
如果需要,可以上传IHWD的工程源码,麻烦各位大虾帮忙看看。另有一帖http://topic.csdn.net/u/20090212/16/46d38bea-fe83-4ee5-aab1-2c61983f0515.html,两帖合并。

解决方案 »

  1.   

    这个问题确实奇怪,为什么vb读不出注册表中的类型库呢1、把IDL文件帖出来看看。
    2、接口映射表中是否添加了IDispatch的映射项
    3、在FinalConstruct()里设置断点,在VB加载组件时跟踪QueryInterface的过程,看看IDispatch是否返回成功最后尝试一下把组件类的IDispatchImpl<...>中的模板参数最后两个参数(版本号)都改成0xffff试试
      

  2.   

    为什么都从IDispatch派生,你可以把所以支持自动化的功能整合到一个双接口中,如果都从IDispatch派生,只有一个默认的自动化接口,那是哪个呢?
      

  3.   

    x.Cancel 方法是不是后加的?网页从注册表中读取类库,VC调用是从文件中读取,有时候,注册表中不一定是最新的内容,反注册原来的控件,重新注册看一看
      

  4.   

    确实各个组件是独立的,接口映射表中有IDispath项。
    idl文件太长,贴不上来,整个工程的下载地址在这里(包含测试程序及代码):
    http://202.102.234.68:5679/ihwd.rar请查看!