ATL server registration may fail if you logged on by using an account that does not have appropriate registry user rights (190686)



The information in this article applies to:

  • The Microsoft Active Template Library (ATL) 2.1, when used with:
    • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
    • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
    • Microsoft Visual C++, 32-bit Professional Edition 5.0
    • Microsoft Visual C++, 32-bit Professional Edition 6.0
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • The Microsoft Active Template Library (ATL) 3.0, when used with:
    • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
    • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
    • Microsoft Visual C++, 32-bit Professional Edition 5.0
    • Microsoft Visual C++, 32-bit Professional Edition 6.0
    • Microsoft Visual C++, 32-bit Learning Edition 6.0

This article was previously published under Q190686

SYMPTOMS

Registration or unregistration of ATL servers may fail on a machine if the logged-on user doesn't have appropriate registry user rights. In-process servers may fail and display the following message:
DllRegisterServer in projectname.dll failed. Return code was:
0x80020009.
Debug EXE servers, linked statically to the registrar code and run in the debugger, may display the following trace messages:
Failed to register, cleaning up!
The thread 0xnn has exited with code -2147352567 (0x80020009).

CAUSE

CRegKey is a class used by ATL for manipulating the registry. It's Open() and Create() methods have a REGSAM argument that specifies the security access to the particular registry key.

The REGSAM argument defaults to KEY_ALL_ACCESS. In several places in the ATL code, Open() and Create() are called without specifying the REGSAM, which means it defaults to KEY_ALL_ACCESS. KEY_ALL_ACCESS is a combination of other flags including WRITE_DAC and WRITE_OWNER.

For a nonadministrator, you may not have WRITE_DAC and WRITE_OWNER permissions, which causes registration to fail.

RESOLUTION

In ATLBASE.H, change the default REGSAM for CRegKey::Create() and CRegKey::Open() to KEY_READ|KEY_WRITE:
   class CRegKey
   {
      ...
      LONG Create(HKEY hKeyParent, LPCTSTR lpszKeyName, LPTSTR lpszClass =
         REG_NONE, DWORD dwOptions = REG_OPTION_NON_VOLATILE,
         REGSAM samDesired = KEY_READ | KEY_WRITE, // changed REGSAM
         LPSECURITY_ATTRIBUTES lpSecAttr = NULL,
         LPDWORD lpdwDisposition = NULL);
      LONG Open(HKEY hKeyParent, LPCTSTR lpszKeyName,
         REGSAM samDesired = KEY_READ | KEY_WRITE);  // changed REGSAM
      ...
   };
				
You need to link statically to the registrar. Building for ReleaseMinDependency will statically link to the registrar. Debug builds link dynamically to the registrar via Atl.dll. You need to add _ATL_STATIC_REGISTRY to the list of Preprocessor definitions. You can do this on the Project menu by clicking Settings. Click the C/C++ tab and select General under Category.

For more information, click the following article number to view the article in the Microsoft Knowledge Base:

166717 Instructions for statically linking to registrar code

STATUS

Microsoft has confirmed that this is a bug in the Microsoft products that are listed in the "Applies to" section. This problem was corrected in Microsoft Visual C++ .NET.

REFERENCES

For more information about ATL registration, click the following article numbers to view the articles in the Microsoft Knowledge Base:

166217 PRB: ATL EXE server built on Windows 95 errors while registering

167927 PRB: Building ATL service project does not register the service

179688 FIX: ATL servers do not unregister their type library

185677 FIX: ATL service with space in name is not registered correctly

186391 FIX: ATL controls don't remove CLSID key during unregistration

(c) Microsoft Corporation 1998, All Rights Reserved. Contributions by Samson Tanrena, Microsoft Corporation

Modification Type:MajorLast Reviewed:9/1/2005
Keywords:kbtshoot kbBug kbfix kbNoUpdate kbRegistry KB190686