1、问题情形
创建ATL项目时,使用VC每增加一个COM类,就会生成一个对应的rgs文件。
在vista及win7系统中,如果增加了HKLM注册表项,而生成的程序并不是以管理员身份运行时,就会出现本该写入HKCU的某些注册表项并没有被写入。
2、问题原因
由于调用DllRegisterServer时,如果加载的rgs文件中的注册表项中的某一项写入注册表失败,后面的就不写入了。
以下是ATL源码:可以看出,注册如果出错,就break了。
ATLINLINE ATLAPI AtlComModuleRegisterServer(_ATL_COM_MODULE* pComModule, BOOL bRegTypeLib, const CLSID* pCLSID)
{
ATLASSERT(pComModule != NULL);
if (pComModule == NULL)
return E_INVALIDARG;
ATLASSERT(pComModule->m_hInstTypeLib != NULL);
HRESULT hr = S_OK;
for (_ATL_OBJMAP_ENTRY** ppEntry = pComModule->m_ppAutoObjMapFirst; ppEntry < pComModule->m_ppAutoObjMapLast; ppEntry++)
{
if (*ppEntry != NULL)
{
_ATL_OBJMAP_ENTRY* pEntry = *ppEntry;
if (pCLSID != NULL)
{
if (!IsEqualGUID(*pCLSID, *pEntry->pclsid))
continue;
}