BUG: ATL Server Registration May Fail for Non- AdministratorsID: Q190686
|
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:
Debug EXE servers, linked statically to the registrar code and run in the debugger, may display the following trace messages:DllRegisterServer in projectname.dll failed. Return code was:
0x80020009.
Failed to register, cleaning up!
The thread 0xnn has exited with code -2147352567 (0x80020009).
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.
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.
Q166717 DOC: Instructions for Statically Linking to Registrar Code.
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.
Other articles related to ATL registration:
Q166217 PRB: ATL EXE Server Built On Windows 95 Errors While Registering(c) Microsoft Corporation 1998, All Rights Reserved. Contributions by Samson Tanrena, Microsoft Corporation
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
© Microsoft Corporation 1998, All Rights Reserved.
Contributions by Samson Tanrena, Microsoft Corporation
Additional query words: kbDSupport user poweruser administration nonadministrator rights
Keywords : kbATL kbATL210bug kbRegistry kbVC500bug kbVC600bug kbATL300bug
Version : WINDOWS:2.1,3.0
Platform : WINDOWS
Issue type : kbbug
Last Reviewed: July 15, 1999