BUG: ATL Server Registration May Fail for Non- Administrators

ID: Q190686


The information in this article applies to:
  • The Microsoft Active Template Library (ATL), versions 2.1, 3.0, used with:
    • Microsoft Visual C++, 32-bit Editions, versions 5.0, 6.0


SYMPTOMS

Registration or unregistration of ATL servers may fail on a machine if the logged-on user doesn't have appropriate registry access 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 non-administrator, 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 additional information, please see the following article(s) in the Microsoft Knowledge Base:
Q166717 DOC: Instructions for Statically Linking to Registrar Code.


STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. We are researching this bug and will post new information here in the Microsoft Knowledge Base as it becomes available.


REFERENCES

Other articles related to ATL registration:

Q166217 PRB: ATL EXE Server Built On Windows 95 Errors While Registering

Q167927 BUG: Building ATL Service Project Does Not Register the Service

Q179688 PRB: ATL Servers Do Not Unregister Their Type Library

Q185677 BUG: ATL Service with Space in Name Is Not Registered Correctly

Q186391 BUG: ATL Controls Don't Remove CLSID Key During Unregistration
(c) Microsoft Corporation 1998, All Rights Reserved. Contributions by Samson Tanrena, Microsoft Corporation

© Microsoft Corporation 1998, All Rights Reserved.
Contributions by Samson Tanrena, Microsoft Corporation

Additional query words: kbDSupport user poweruser administration nonadministrator rights

Keywords : kbActiveX kbATL210bug kbCOMt kbRegistry kbVC500bug kbVC600bug kbATL300bug
Version : WINDOWS:2.1,3.0
Platform : WINDOWS
Issue type : kbbug


Last Reviewed: November 23, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.