com编程错误急问:0x80040154 没有注册类别

byebyeideal 2003-07-23 03:21:16
我要操作的com对象是一个第三方所提供的一个exe程序,错误表现为:
1)在vb中可以从reference中引入对应的exe文件,
并可使用Dim com As New libname.objectname进行调用,
而且调用时一切正常。
2)我用ultraedit打开vb的vbp文件,得到vb工程的引用信息
Reference=*\G{4D147C00-2321-11D7-B55D-00A02442C845}。。。
由此我确定此com对象的clsid为4D147C00-2321-11D7-B55D-00A02442C845
并检查注册表,得出相同的clsid
3)接着在vc中进行com编程,代码为:
static const IID CLSID_OCR
={0xA9939280, 0x2322, 0x11D7, 0xB5, 0x5D, 0x00, 0xA0, 0x24, 0x42, 0xc8, 0x45};
hr = CoInitialize(NULL);
if(!SUCCEEDED(hr))
{
AfxMessageBox("create object fail!");
}
hr = CoCreateInstance(CLSID_OCR, NULL, CLSCTX_INPROC_SERVER,
IID_IUnknown, (void **)&(pUnk));
if(!SUCCEEDED(hr))
{
AfxMessageBox("create object fail!");
}

CoUninitialize();
但是在debug的过程中,总是发现执行CoCreateInstance失败,
用error lookup发现是0x80040154 没有注册类别
4)按照我的理解,既然vb可以对这个exe进行引用并进行正常操作,
应该来说就是这个com对象是正常的,而且也是注册了的,
那我碰到的错误又是什么问题呢?

请各位大侠多多赐教,小弟会在线等候,谢谢!!!
...全文
2991 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
ultralzl 2003-09-02
  • 打赏
  • 举报
回复
虽然这个帖子过了好长时间了,但是,因为我遇到了这样的问题,也在网上搜索到这个帖子,但是没有获得答案。可能以后也会有人遇到这个问题,所以,我将我的解决方法写下来,可供别人参考。

出现0x80040154 没有注册类别 错误是因为注册表中的COM注册项错误了。
假设这个COM组件名字是Test.exe。
如果你有Test.exe的源代码,找到有关注册表的文件,在使用ATL开发的COM组件中,注册信息在以rgs结尾的文件中。
如果你只有一个Test.exe,没有其它的文件,那么你打开Test.exe(通过UltraEdit等工具),查找“HKCR”,一般会有两处,这两处地方就是Test.exe的注册信息,其内容看看就知道了。

注册信息中有一项 LocalServer32 = s '%MODULE%',一般来说问题出在这里,就是你的注册表中的LocalServer32这一项没有指向你的Test.exe所在地位置,你可以通过在注册表中查找LocalServer32 = s '%MODULE%'上面几行的Test.exe的GUID(一般在上面4行处,写着ForceRemove {783D1E26-869B-11D7-BCD2-0000E88263A3} = s 'Test Class',查找{783D1E26-869B-11D7-BCD2-0000E88263A3}就可),找到了就看LocalServer32这一项是否与你的Test.exe路径一致,如果不一致,就会报错0x80040154 没有注册类别。

我用VC的ATL写一个EXE的COM控件时,在resource.h中有两个ID的定义,这两个ID是以IDR_XXXXX开头的。我开始更改了其中一个的名字。ATL需要这个名字,它在rc资源文件中有一个地方用到了这个ID名字(指定COM控件的注册表文件名字),同时在ATL的接口类中有个宏也用到了这个名字(DECLARE_REGISTRY_RESOURCEID())。这三个地方的IDR_XXXXX要相同,只要有一个地方不相同,注册的时候就会有一个rgs的注册表文件没有注册。
所以我使用CoCreateInstance测试组件时,它使用的仍然是我最开始没有更改IDR_XXXXX前的注册路径,而这个路径已经被删除,所以出现没有注册类别的错误,没有找到这个COM组件。
warmchang 2003-09-02
  • 打赏
  • 举报
回复
关注,^_^
oiq 2003-07-26
  • 打赏
  • 举报
回复
工程目录下有一个.reg的文件,看看与组件同名的该类文件中的CLSID是否与组件相同。


http://www.dpspace.com
omnivore 2003-07-26
  • 打赏
  • 举报
回复
我在微软的新闻组上看到好像对这个错误就提供了一种解释,
ATL.DLL没有注册.
我没有用过vb,不知道他是怎么处理的。
楼主可以重新注册试试,向前面说的,注意那个atl.dll的版本。
好像在新的版本中使用的是atl70.dll
你可以google一下,看看。
navychen 2003-07-25
  • 打赏
  • 举报
回复
我也遇到一样的问题, DEBUG版本的ATL COM注册不上, 报module class not found
Release版本没问题
byebyeideal 2003-07-25
  • 打赏
  • 举报
回复
to luohualiusui:是应该改成local_server,但还是不行
to fantong:oleview下面看到的typelib的clsid是一模一样的
omnivore 2003-07-24
  • 打赏
  • 举报
回复
楼主,我查了一下google,发现这个错误发生的原因是
ATL动态库没有注册。
你找到与你的平台相应的版本,WIN98 ANSI版本
WIN2000 UNICODE版本
将其注册就可以了
luohualiushui 2003-07-24
  • 打赏
  • 举报
回复
嘿嘿
又多了一条三角裤
luohualiushui 2003-07-24
  • 打赏
  • 举报
回复
我对VB不熟,不知道工作原理是不是和VC下一样
先改成CLSCTX_LOCAL_SERVER试试,看服务器能不能启动
如果能启动,还是出错,那可能是注册类厂问题
如果没启动,那你去注册表找CLSID,看LOCALSERVER32键下的值对不对
Microsoftadherent 2003-07-24
  • 打赏
  • 举报
回复
ms-help://MS.VSCC/MS.MSDNVS.2052/com/cme_a2d_152w.htm,或许你的组件重新注册一次!
byebyeideal 2003-07-24
  • 打赏
  • 举报
回复
to luohualiushui:
是的,是一个进程外组件
我在vb中用引入、再new的方法可以控制服务器程序的启动和关闭的,
如果不用CLSCTX_INPROC_SERVER,哪应该用哪个呢?

to 东东:
这个错误的意思是说“没有注册类别”
fantong 2003-07-24
  • 打赏
  • 举报
回复
to:omnivore(东东)
atl.dll只有一些很老的98,95下才没有,其他的系统好像都自带了,注意2000下的atl.dll和98下的是不一样的,一个是ansi一个是unicode的
to:byebyeideal
你用oleview看看这个exe的typelib,确定一下clsid有没有错误
luohualiushui 2003-07-23
  • 打赏
  • 举报
回复
按搂主所说的应该是一个进程外组件
那运行程序的时候服务器程序能否启动???
CLSCTX_INPROC_SERVER肯定是不对的
omnivore 2003-07-23
  • 打赏
  • 举报
回复
我在注册一个组件的时候,也出现了这个错误。
我是使用regsvr32 ***.dll。
弹出对话框说,调用DllRegisterServer函数时出现错误,错误码就是这个
0x80040154这个错误号;
不知道是为什么?
这个错误到底是什么意思?
该控件是vc下用atl写成的,曾经运行过,没有问题。
谢谢楼主,借你的贴一用。
你要是缺分,我再开贴给你。
byebyeideal 2003-07-23
  • 打赏
  • 举报
回复
to fantong:
不明白你的意思啊,怎么import?
fantong 2003-07-23
  • 打赏
  • 举报
回复
改用import这个exe看看行不?
怀疑是clsid错误了
byebyeideal 2003-07-23
  • 打赏
  • 举报
回复
CLSCTX_INPROC_SERVER改为CLSCTX_ALL
还是一样的报错。。
cheng_young 2003-07-23
  • 打赏
  • 举报
回复
CLSCTX_INPROC_SERVER改为CLSCTX_ALL
byebyeideal 2003-07-23
  • 打赏
  • 举报
回复
不好意思,这个是个笔误,
clsid是一样的
luohualiushui 2003-07-23
  • 打赏
  • 举报
回复
static const IID CLSID_OCR
={0xA9939280, 0x2322, 0x11D7, 0xB5, 0x5D, 0x00, 0xA0, 0x24, 0x42, 0xc8, 0x45};
这个clsid是哪来的,和你上面得到的clsid不一样啊
加载更多回复(2)

3,248

社区成员

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

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