ATL com组件注册

lcy853142 2009-07-14 03:30:25
请教
我现在有两个com组件,我想将两个com组件注册到注册表中的同一个组下,同时提供一个GUID,通过这个GUID值
能够找到这个组,然后能够枚举出这个组下的所有com组件
请问怎么在rgs文件中修改
...全文
190 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ID大头哈哈 2009-07-18
  • 打赏
  • 举报
回复
你是想添加到自定义的组件类别组中吧
在自注册函数中 
1 完成自注册
2 调用CreateComponentCategory创建自定义组件类别
2 调用RegisterCLSIDInCategory注册组件类别


//自定义组件类别
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
{
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (FAILED(hr))
return hr;
// Make sure the HKCR\Component Categories\{..catid...}
// key is registered.
CATEGORYINFO catinfo;
catinfo.catid = catid;
catinfo.lcid = 0x0409 ; // english
// Make sure the provided description is not too long.
// Only copy the first 127 characters if it is.
int len = wcslen(catDescription);
if (len>127)
len = 127;
wcsncpy(catinfo.szDescription, catDescription, len);
// Make sure the description is null terminated.
catinfo.szDescription[len] = '\0';
hr = pcr->RegisterCategories(1, &catinfo);
//if (!FAILED(hr))
//MessageBox(NULL,catDescription,_TEXT("CreateComponentCategory"),MB_OK);
pcr->Release();
return hr;
}
// 注册组件种类
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
// Register your component categories information.
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (SUCCEEDED(hr))
{
// Register this category as being "implemented" by the class.
CATID rgcatid[1] ;
rgcatid[0] = catid;
hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
/* if (!FAILED(hr))
MessageBox(NULL,_TEXT("successful"),_TEXT("RegisterCLSIDInCategory"),MB_OK);*/
}
if (pcr != NULL)
pcr->Release();
return hr;
}
yxder 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lcy853142 的回复:]
这样做不行
我刚试了
因为如果注册第一个之后
再注册第二个,不会注册到同一个键下
而是用第二个的信息替换掉第一个去了
[/Quote]

要么你就把其中一个ID更改下,分别调用哪个,要么你就是用COM组件的包容或者聚合,不知道把2个控件打包了能行不?
yxder 2009-07-16
  • 打赏
  • 举报
回复
原理比较好理解,但是目前我还实现不了,若你能实现了,顺便教教我
yxder 2009-07-16
  • 打赏
  • 举报
回复
可以尝试下 包容 或者 聚合,把2个控件合并成一个注册
lcy853142 2009-07-16
  • 打赏
  • 举报
回复
我已经实现了
oysoft 2009-07-15
  • 打赏
  • 举报
回复
1.看系统是否存在组件类别管理器(comcat.dll)
2.类型射逻辑没有尝试在尝试一个类注册为(不存在)类别的成员之前把类别添加到系统中,需要自己在rgs中手动添加
lcy853142 2009-07-14
  • 打赏
  • 举报
回复
楼上的大哥
我使用组件类别管理
可是搞不定
我是这样做的
比方说我有两个组件A、B
我在A组件对象的IDl文件中定义了一个组件类别CATID
const static GUID CHSJ_CARD = { 0x4b1f95d, 0x5f8e, 0x4b53, { 0xa3, 0xbb, 0xc6, 0xf6, 0xc7, 0x48, 0xbb, 0x38 } };
然后在rgs文件中这样注册类别管理对象的
NoRemove 'Component Categories'
{
{04B1F95D-5F8E-4b53-A3BB-C6F6C748BB38}
{
val 409 = s 'CHSJ_CARD'
}
}
并且在组件对象里
使用宏
BEGIN_CATEGORY_MAP(CCHCHKCard)
IMPLEMENTED_CATEGORY(CHSJ_CARD)
END_CATEGORY_MAP()

B组件里也是这样弄的

组件类别是给注册到注册表Component Categories 下了
可是他下面什么也没有

请问这是怎么回事
oysoft 2009-07-14
  • 打赏
  • 举报
回复
COM支持 组件类别管理
比如说,能被IE调用的COM对象要求实现一系列接口,如果你的COM对象实现了这一系列接口,你就可以声明这个接口属于CATID_SafeForBrowsing(大概是这么写)或CATID_SafeForScripting,这样IE调它是就不会报出“此控件不安全”之类的警告。声明组件类别在ATL中用BEGIN_CATEGORY_MAP宏。
lcy853142 2009-07-14
  • 打赏
  • 举报
回复
这样做不行
我刚试了
因为如果注册第一个之后
再注册第二个,不会注册到同一个键下
而是用第二个的信息替换掉第一个去了
fengrx 2009-07-14
  • 打赏
  • 举报
回复
楼主将 中的'TypeLib' = s '指向的ID修改成同一个试下,

注意:idl文件中library指向的ID和这个ID要一致。两个IDL文件,两个RGS文件,共四个地方需要修改成这个ID。
lcy853142 2009-07-14
  • 打赏
  • 举报
回复
可不可以指定注册到同一个键下?
高手给解答一下
fengrx 2009-07-14
  • 打赏
  • 举报
回复
不可能吧,
不同的COM组件就已经使用不同的ID了。
楼主如果想实现这样的效果,为什么不直接把两个组件的代码放在一个里边呢。

3,245

社区成员

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

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