例如:HKCR
{
Simple8.DispSimple.1 = s 'DispSimple Class'
{
CLSID = s '{8C98D25A-43CA-48AD-986F-EB0065251C52}'
}
Simple8.DispSimple = s 'DispSimple Class'
{
CurVer = s 'Simple8.DispSimple.1'
}
NoRemove CLSID
{
ForceRemove {8C98D25A-43CA-48AD-986F-EB0065251C52} = s 'DispSimple Class'
{
ProgID = s 'Simple8.DispSimple.1'
VersionIndependentProgID = s 'Simple8.DispSimple'
ForceRemove Programmable
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
TypeLib = s '{102B5748-138A-4432-87C2-9CC689D16F41}'
Version = s '1.0'
}
}
}
编译了以后我搜索注册表,发现这是个类型库的键值,在CLSID=8C98D25A-43CA-48AD-986F-EB0065251C52下面。
但是idl文件里面声明的接口id如下,却没有在rgs文件里面。但是在注册表里面可以找到:(这个在注册表HKCR\Interface下面)[
object,
uuid(5F882D6A-CAAC-45D4-A8AA-7F83AFDA3E23),
dual,
nonextensible,
pointer_default(unique)
]
interface IDispSimple : IDispatch{
    [id(1)] HRESULT Add([in] VARIANT n1, [in] VARIANT n2, [out,retval] VARIANT* pVal);
    [id(2)] HRESULT Upper([in] BSTR str, [out,retval] BSTR* pVal);
};
我的问题是: 为什么rgs文件里面没有包含接口的SID ?
谢谢!

解决方案 »

  1.   

     
      组件对象注册 是不需要注册自身接口的,具体是创建组件的时候 QueryInterface 内部来判断接口支持的
      如果仅进程内部使用,接口不需要注册   当接口需要列集时(比如跨进程) 接口需要注册自己的代理处理(可以查看HKRK下 interface子键)
      

  2.   

    注册表只需要保存LIBID/CLSID,用于组件的自动发现和创建,至于IID,那是组件内部的事情,一般都在类型库里,保存在单独的文件或者PE资源里。如果整个类型库信息都存放注册表,太占用注册表空间了,而且毫无意义。