ATL::CRegKey的m_samWOW64公共成员作用及使用疑问
关于ATL::CRegKey的m_samWOW64成员的疑问
ATL::CRegKey类拥有一个类型为REGSAM的公共数据成员m_samWOW64,该成员通常初始化为0,但在CRegKey::Create等方法中会按如下代码设置:
... m_hKey = hKey; #if WINVER >= 0x0501 m_samWOW64 = samDesired & (KEY_WOW64_32KEY | KEY_WOW64_64KEY); #endif
从代码逻辑来看,m_samWOW64似乎用于跟踪CRegKey::Create中指定的WOW64访问权限。但通过CRegKey::Attach将原生HKEY关联到CRegKey实例时,该成员会被设为0。查看CRegKey的实现代码可知,部分方法按上述方式设置该成员,部分方法则直接将其设为0,因此无法始终信任它存储的关联键的WOW64访问权限。此外,MSDN的ATL::CRegKey文档中未提及该公共数据成员。
请问在使用ATL::CRegKey的C++客户端代码中是否应忽略m_samWOW64?它是历史遗留代码,还是MSDN存在文档缺失的问题?
回答
- 你应该忽略
m_samWOW64这个公共成员,不要在客户端代码中直接依赖它。 - 核心原因是该成员的赋值逻辑不一致:仅
Create等少数方法会根据传入的权限参数设置它,但Attach等其他方法会直接将其置0,导致它无法准确反映当前关联注册表键的实际WOW64访问上下文,依赖它极易引发逻辑错误。 - 关于它的性质:更倾向于是MSDN的文档缺失,而非单纯的历史遗留代码。在WINVER≥0x0501(即Windows XP及以上版本)的环境中,
Create等方法确实在维护这个成员,但官方文档未公开它,说明它属于ATL内部实现细节,并非设计给外部客户端使用的公开API。 - 总结:ATL类中未文档化的公共成员本质是内部实现的一部分,外部代码直接访问这类成员存在兼容性风险——后续ATL版本完全可能修改甚至移除它,导致你的代码出现兼容性问题。
内容的提问来源于stack exchange,提问作者Mr.C64
相关产品推荐
相关产品推荐

