COM学习时遇到问题:注册COM DLL后,注册表中找不到CLSID

wowosksk 2015-04-11 11:40:15
了解COM的兄弟帮忙指点下:
提示dll已注册,在注册表中CLSID下能找到COM组件ID,但是找不到COM类ID。
手工用Regsvr32注册也提示已注册。

例程序代码:
idl文件
// IWzd.idl : IDL source for the IWzd interface
//
// NOTE: no automation declarations--use MFC's built-in support for that
import "unknwn.idl";
[
object,
uuid(C177116E-9AAA-11D3-805D-000000000000),//[color=#0000FF]注册表找到
[/color] pointer_default(unique)
]
interface IWzd : IUnknown
{
HRESULT Method1([in] long lArg1, [out] long *plArg2);
HRESULT Method2([in] long lArg, [in] unsigned long ulArg);
};

COM组件类文件WzdSrv.cpp
// {4487D431-A6FF-11D3-A398-00C04F570E2C}
static const IID IID_IWzdSrv ={ 0x4487d431, 0xa6ff, 0x11d3, { 0xa3, 0x98, 0x0, 0xc0, 0x4f, 0x57, 0xe, 0x2c } };
// add this line from idl project (iwzd_i.c)组件ID
const IID IID_IWzd = {0xC177116E,0x9AAA,0x11D3,{0x80,0x5D,0x00,0x00,0x00,0x00,0x00,0x00}};
注册表中找到

BEGIN_INTERFACE_MAP(CWzdSrv, CCmdTarget)
INTERFACE_PART(CWzdSrv, IID_IWzdSrv, Dispatch)
INTERFACE_PART(CWzdSrv, IID_IWzd, WzdClass) // add this line
END_INTERFACE_MAP()

// {4487D432-A6FF-11D3-A398-00C04F570E2C}
IMPLEMENT_OLECREATE(CWzdSrv, "Server.WzdSrv", 0x4487d432, 0xa6ff, 0x11d3, 0xa3, 0x98, 0x0, 0xc0, 0x4f, 0x57, 0xe, 0x2c)
注册表中找不到


客户端定义组件接口以及组件类ID

// guids.h : guids used by this project
//
#if !defined guids_h
#define guids_h

const IID CLSID_IWzdSrv = { 0x4487d432, 0xa6ff, 0x11d3, 0xa3, 0x98, 0x0, 0xc0, 0x4f, 0x57, 0xe, 0x2c };color=#0000FF]注册表中找不到
const IID IID_IWzd = {0xC177116E,0x9AAA,0x11D3,{0x80,0x5D,0x00,0x00,0x00,0x00,0x00,0x00}};[/color]注册表中能找到

#endif

客户端cpp调用
HRESULT hr=::CoCreateInstance(
CLSID_IWzdSrv, // name of dll to load
NULL, // aggregated COM object (none)
CLSCTX_INPROC_SERVER,// use dll
IID_IWzd, // class to create and object of
(LPVOID*) &iWzd); // returned object pointer
提示错误
...全文
1458 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-08-05
  • 打赏
  • 举报
回复
请跟着MSDN官方教程学习COM
lookatu 2015-08-04
  • 打赏
  • 举报
回复
我也遇到了类似的问题,楼主解决了吗,咋解决的啊?
newerC 2015-04-22
  • 打赏
  • 举报
回复
CLSID_IWzdSrv 是最重要的, 如果注册完HKEY_CLASSES_ROOT\CLSID\下没有该类的clsid 系统肯定找不到com对象的. mfc 的com自动生成代码不是太了解了, 但原理上都是一样的, 你可以跟一下你的com dll中的DllRegisterServer方法, 看注册时都注册了哪些东西.
wowosksk 2015-04-14
  • 打赏
  • 举报
回复
有人没,谁高手给小弟讲有啥规则没?
wowosksk 2015-04-14
  • 打赏
  • 举报
回复
建立的是MFC DLL工程,然后加的COM类:代码的COM接口和COM类继承也关联了: BEGIN_INTERFACE_PART(WzdClass, IWzd) STDMETHOD_(HRESULT,Method1)(long, long *); STDMETHOD_(HRESULT,Method2)(long, unsigned long); END_INTERFACE_PART(WzdClass) 然后用regsvr32 ../IWzd.dll手工注册的。 不用必须写.reg文件来注册吧。
wowosksk 2015-04-14
  • 打赏
  • 举报
回复
这个工程是我手工注册的,没有用rgs文件。
oyljerry 2015-04-13
  • 打赏
  • 举报
回复
查看你com工程中的rgs文件,是否描述对应的注册表信息
wowosksk 2015-04-13
  • 打赏
  • 举报
回复
杂么没人呢,有人看没?

3,245

社区成员

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

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