引用:http://hi.baidu.com/71167609/blog/item/42c32819786f607fdbb4bd75
1、使用ATL向导的话,会在resource中产生一个rgs的注册脚本文件放在"REGISTRY"目录中用来注册组件,会在程序中通过函数DECLARE_REGISTRY_RESOURCEID(IDR_OPCSERVER)使用,IDR_OPCSERVER就是向导产生的资源文件的ID,当服务器调用CComModule::RegisterServer()时,便会使用这些脚本来载入注册表的设置,并在调用CComModule::UnregisterServer()时移除它们。所有COM的注册键都放在HKEY_CLASSES_ROOT中。
HKCR 表示注册表中COM对象的注册项是HKEY_CLASS_ROOT 的缩写;
NoRemove表示在反注册过程中不要删除这层注册表项;ForceRemove表示要要完全删除后面的项然后重新创建。
2、VC的ATL向导会生成com对象注册用的rgs文件。如果程序中有想写到注册表中的地方,可以手工编辑这个脚本,可以省去调用一堆操作注册表的API。
关于rgs的详细规则,MSDN上面有,搜索ATL Registrar这个主题即可以看到,下面只是一点简单的介绍:
HKCR //表示下面的注册表项都写到HKCR下面
{
SecEdit.EditCtrl.1 = s 'EditCtrl Class' //表示在HKCR下面增加项 SecEdit.EditCtrl.1 ,s 表示值的类型是字符串
{
CLSID = s '{E0E9F6EF-871B-42AE-89C9-CD6AF7A2E5D3}'
}
SecEdit.EditCtrl = s 'EditCtrl Class'
{
CLSID = s '{E0E9F6EF-871B-42AE-89C9-CD6AF7A2E5D3}'
CurVer = s 'SecEdit.EditCtrl.1'
}
NoRemove CLSID //表示在卸载时,不要把CLSID这个项给删除掉了
{
ForceRemove {E0E9F6EF-871B-42AE-89C9-CD6AF7A2E5D3} = s 'EditCtrl Class'
{
ProgID = s 'SecEdit.EditCtrl.1'
VersionIndependentProgID = s 'SecEdit.EditCtrl'
ForceRemove 'Programmable'
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment' //val表示ThreadingModel是InprocServer32的值,不是 子项
}
ForceRemove 'Control'
ForceRemove 'Insertable'
ForceRemove 'ToolboxBitmap32' = s '%MODULE%, 101'
'MiscStatus' = s '0'
{
'1' = s '131473'
}
'TypeLib' = s '{42A31F29-B586-42B3-9F4A-45C73B38EA51}'
'Version' = s '1.0'
}
}
}