我在网上发现了这个,好心的前辈帮小弟完整的翻译下好么:标准些,我用网上翻译太乱不会整理。。BUG: ATL Server Registration May Fail for Non- Administrators
Q190686
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.
Q190686
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.
帖子发到扩充话题 程序员英语 板块