晕死,如何手动注册一个COM组件

paerxiushi 2008-06-14 10:13:54
我写了一个COM的dll,这个dll并没有实现DllRegisterServer,我想修改注册表来注册组件。于是对注册表进行如下设置:
1.HKEY_CLASSES_ROOT\CLSID下新增一个{XXXXXXXXX-XXXX-XXXX-XXXXXXXXXXXX}
2.设置新增CLSID项下的默认值为类名
2.在新增的CLSID项下新增一个InprocServer32项,
3.设置InprocServer32项的默认值为dll的路径
在调用方 一运行到CoCreateInstance时,返回值为800401F9,也就是CO_E_ERRORINDLL,描述为:Error in the dll.
那个GUID声明如下:

extern "C"
{
extern const IID IID_IX;
extern const IID IID_IY;
extern const IID IID_IZ;
extern const CLSID CLSID_CA;
}


定义形式如下:

extern "C"
{


// {8C0D4FB0-E6B9-47ec-8135-B67E6541F912}
extern const IID IID_IX={
0x8c0d4fb0, 0xe6b9,
0x47ec, 0x81, 0x35, 0xb6, 0x7e, 0x65, 0x41, 0xf9, 0x12
};

// {A2D7DFDF-E9E7-46cd-8A57-5EC3CC586807}
extern const IID IID_IY={
0xa2d7dfdf, 0xe9e7, 0x46cd,
0x8a, 0x57, 0x5e, 0xc3, 0xcc, 0x58, 0x68, 0x7

};

// {C301B0CB-3AB8-42a3-8F3F-ABD9AF50A919}
extern const IID IID_IZ={
0xc301b0cb, 0x3ab8, 0x42a3,
0x8f, 0x3f, 0xab, 0xd9, 0xaf, 0x50, 0xa9, 0x19
};
}

extern const CLSID CLSID_CA={
0xe8169be1, 0xa5b4, 0x4c5c,
0xa4, 0xc6, 0x38, 0x64, 0x27, 0x60, 0xbc, 0x29

};


CLSID_CA就是设置在注册表中的CLSID.
然后调用方的代码如下:

CoInitialize(NULL);
IX* pIX=NULL;
HRESULT hr=CoCreateInstance(CLSID_CA,NULL,
CLSCTX_INPROC_SERVER,
IID_IX,
(void**)&pIX);
if(SUCCEEDED(hr))
{
pIX->Fx();
pIX->Release();
}
CoUninitialize();

请问各位大侠如何解决,小弟下个月就要正式开发COM组件了,急呀!
...全文
454 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
paerxiushi 2008-06-15
  • 打赏
  • 举报
回复
怎么连个人影都没有,我想问一下:DLL是不是实现DllRegisterServer等函数,再实现IClassFactory。调用方才能成功使用。
paerxiushi 2008-06-14
  • 打赏
  • 举报
回复
那位大侠能留个邮箱地址,帮我看看怎么回事,采用实现DllRegisterServer,然后注册也可以。
paerxiushi 2008-06-14
  • 打赏
  • 举报
回复
<com技术内幕>说注册组件时,只需要设置组件的CLSID与DLL的路径,真的是这样吗?
  • 打赏
  • 举报
回复
修改的地方比较多,
你还是写一个能注册的组件,然后找到相关的注册表位置,然后再用在这方面上

3,245

社区成员

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

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