100分求解 调用CoCreateInstance返回错误, 在线等~~

a1dao 2006-06-20 05:31:33
我在用MFC编写的窗体程序的OnInitDialog()函数中, 载入一个dll, 代码如下:

HRESULT hr = ::CoCreateInstance(
CLSID_MSPICmdAdapter, // name of dll to load
NULL, // aggregated COM object (none)
CLSCTX_INPROC_SERVER,// use dll
IID_IMSPICmdAdapter, // class to create and object of
(LPVOID *)&CmdManager.iWzd); // returned object pointer

先前为REGDB_E_CLASSNOTREG, 百度后知道COM组件没有注册, 于是手动写代码注册了一下,
代码如下:
HKEY_CLASSES_ROOT\CLSID\{6FC499C3-A7B7-4F71-9089-B708D4BF58FA} = MSPICmdAdapter
HKEY_CLASSES_ROOT\CLSID\{6FC499C3-A7B7-4F71-9089-B708D4BF58FA}\InProcServer32 = C:\WINDOWS\system32\MSPICOM.dll
HKEY_CLASSES_ROOT\CLSID\{6FC499C3-A7B7-4F71-9089-B708D4BF58FA}\InProcServer32\ThreadingModel = Apartment

发现返回值还是fail为CO_E_NOTINITIALIZED, 再把注册表中的注册信息删除再试, 返回值仍是CO_E_NOTINITIALIZED.

哪位大侠知道为什么? 分不够再加, 多谢.
...全文
829 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
Analyst 2006-06-25
  • 打赏
  • 举报
回复
那你这个组件根本不能自己注册,当然不行了。
a1dao 2006-06-25
  • 打赏
  • 举报
回复
source里面没有发现DllRegisterServer()函数的实现啊
a1dao 2006-06-25
  • 打赏
  • 举报
回复
我只在IWzd.def和MSPICOM.def文件里面看见有DllRegisterServer()函数的定义.

IWzd.def文件内容如下:

LIBRARY "IWzd"

DESCRIPTION 'Proxy/Stub DLL'

EXPORTS
DllGetClassObject @1 PRIVATE
DllCanUnloadNow @2 PRIVATE
GetProxyDllInfo @3 PRIVATE
DllRegisterServer @4 PRIVATE
DllUnregisterServer @5 PRIVATE

MSPICOM.def文件内容如下:

; MSPICOM.def : Declares the module parameters.

LIBRARY "MSPICOM.DLL"

EXPORTS
DllCanUnloadNow @1 PRIVATE
DllGetClassObject @2 PRIVATE
DllRegisterServer @3 PRIVATE
DllUnregisterServer @4 PRIVATE
a1dao 2006-06-25
  • 打赏
  • 举报
回复
组件里面没有.rgs文件, 只有dlldata.c,dlldata.obj,IObserver.h,IWzd.def,IWzd.dsp, IWzd.dsw,IWzd.idl,IWzd.mak,IWzd.ncb,IWzd.opt,IWzd.plg,MSPICOM.def,MSPICOM.dll,MSPICOM.exp,MSPICOM.h,MSPICOM.idl,MSPICOM.lib,MSPICOM.tlb,MSPICOM_i.c,MSPICOM_i.obj,MSPICOM_p.c, MSPICOM_p.obj.
其中, IWzd是主工程.
具体的代码组织方式我不是很明白.
a1dao 2006-06-25
  • 打赏
  • 举报
回复
但我自己注册不上, 那又该怎么办呢?
蒋晟 2006-06-24
  • 打赏
  • 举报
回复
from within your project specificy regsvr32 as the executable to run, the name of your compiled (DEBUG) DLL as the argument and plonk a breakpoint in DllRegisterServer. If you do't reach the breakpoint then something is preventing your DLL from loading (usually another DLL)
There's an MFC example that seems to work just like regsvr32. Look for "Register: Server Registration Utility" in MSDN.
Analyst 2006-06-24
  • 打赏
  • 举报
回复
看一下组件的代码里面的那几个.rgs文件,贴上来看看有没有问题。
a1dao 2006-06-24
  • 打赏
  • 举报
回复
注册到注册表中HKEY_CLASSES_ROOT\CLSID\下的Key值不是一个CLSID,而是一个IID.
真是越来越糊涂了.
a1dao 2006-06-24
  • 打赏
  • 举报
回复
当用RegSvr32注册的时候,是怎么知道哪个值会被注册到注册表里面的,哪位大侠知道,谢谢.
a1dao 2006-06-22
  • 打赏
  • 举报
回复
越来越糊涂了.
注册是成功了, 但注册表里面却搜不到.
但如果MSPICOM.dll是放在System32下面,是可以注册上去,但值不对,变成{EF09965B-B3DA-4E30-AB95-EBC6CD34AEFD}.
这个值是是另一个定义:
const IID IID_IProtocolCom = {0xEF09965B,0xB3DA,0x4E30,{0xAB,0x95,0xEB,0xC6,0xCD,0x34,0xAE,0xFD}};

const IID IID_IMSPICmdAdapter = {0xE535B2DB,0xB533,0x4FFD,{0x8B,0x4A,0x8B,0x4B,0xD0,0x3F,0x8B,0xEB}};

const IID IID_IMSPITrans = {0x4EEC8AD6,0xCA9A,0x4A11,{0x9B,0xFE,0x9C,0x43,0xEE,0x35,0x1F,0xA4}};

const IID LIBID_MSPICOMLib = {0x24E56EC4,0xED0C,0x403D,{0xBB,0x66,0x01,0xC0,0x3C,0xCA,0xB2,0x92}};

const CLSID CLSID_ProtocolCom = {0x76E2458F,0x0CE6,0x4C49,{0xA3,0x0D,0x7E,0xFE,0x8E,0x60,0x17,0xDB}};

const CLSID CLSID_MSPICmdAdapter = {0x6FC499C3,0xA7B7,0x4F71,{0x90,0x89,0xB7,0x08,0xD4,0xBF,0x58,0xFA}};

const CLSID CLSID_MSPITrans = {0xF461D790,0x2761,0x4EDF,{0x89,0x47,0x5C,0xF8,0x28,0x75,0x24,0x2D}};
Analyst 2006-06-22
  • 打赏
  • 举报
回复
先用RegSvr32 MSPICOM.dll注册看看是否成功,然后检查一下DLL是否被注册正确,打开注册表看一下HKEY_CLASSES_ROOT\CLSID\{6FC499C3-A7B7-4F71-9089-B708D4BF58FA}\InProcServer32 是否指向你的DLL。如果还有问题再检查一下CLSID_MSPICmdAdapter是否为{6FC499C3-A7B7-4F71-9089-B708D4BF58FA}。
a1dao 2006-06-22
  • 打赏
  • 举报
回复
用Analyst的办法把程序文件夹拷到根目录下, 且添加了CoInitialize(0)试了一下, 返回值为REGDB_E_CLASSNOTREG.
BTW, 我看了一些sample的代码,似乎调用CoCreateInstance前一般不调用CoInitialize(0)的.

"用RegSvr32 作为命令行启动调试。单步跟踪一下DLLRegisterServer的执行过程", 这个是怎么做, 能说的详细点吗?

在运行到CoCreateInstance()的时候, 点Step Into, 是直接就跳到下一步了, 不能跟进去的. 怎么在DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)函数里面加断点. 我打开DLLOLE.CPP文件, 添了个断点试了一下,没断下来.
a1dao 2006-06-21
  • 打赏
  • 举报
回复
查找了一下C盘, 有5个atl.dll, system32下面也有, 应该没有问题.
这个dll我曾经clean后, 重编译过.
francsescoli 2006-06-21
  • 打赏
  • 举报
回复
顶.
uglystone 2006-06-21
  • 打赏
  • 举报
回复
参照com技术内幕,注册那一章
蒋晟 2006-06-21
  • 打赏
  • 举报
回复
用RegSvr32 作为命令行启动调试。单步跟踪一下DLLRegisterServer的执行过程
seasol 2006-06-21
  • 打赏
  • 举报
回复
你看一下系统目录有没有ATL.dll。或者你将这个DLL重新编译一遍。

=======================================
 愤怒以愚蠢开始,以后悔告终。——毕达哥拉斯
 CSDN助手 签名走马灯
a1dao 2006-06-21
  • 打赏
  • 举报
回复
这个dll的source我有, 是VC6.0下build的,有一个idl文件,应该是用的MIDL编译的吧.
edrftgyh 2006-06-21
  • 打赏
  • 举报
回复
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
在上面函数中设置断点. 跟踪一下是在那里出错.
Analyst 2006-06-21
  • 打赏
  • 举报
回复
0x80040154是REGDB_E_CLASSNOTREG不是CO_E_NOTINITIALIZED。在初始化的地方一定要调用CoInitialize(0);
用命令行工具regsvr32手工注册你的DLL,如果还是有问题的话,检查一下你DLL所在路径里是否包含有中文名,VC6的ATL有一个BUG,对中文名不支持,换个路径再试。
加载更多回复(11)

3,245

社区成员

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

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