注册表项无法操作在Windows7环境下(Can't Open Registry by Using CRegKey::Open )遍历注册表项

来源:互联网 发布:javascript sort() 编辑:程序博客网 时间:2024/05/21 15:50

最近做一个注册表扫描的项目,遇到一些问题,现已解决,拿出来分享分享,大家见笑了!

 

编写一个MFC程序,用CRegKey生成的对象reg的Open()函数打开注册表居然只能用KEY_READ权限,用KEY_WRITE不能成功.只有HKEY_CURRENT_USER项的部分能用KEY_WRITE权限。以下是注册表遍历(编译环境UNICODE字符环境):

 

调用试例:

遍历HKEY_USERS项

EnumKKey(L"HKEY_USERS",HKEY_USERS,L"");

 

//递归函数

EnumKKey(const char *strAllPath, HKEY hkey, char *sKeyName)
{
  CRegKey regParent;
 if(ERROR_SUCCESS == regParent.Open(hkey,sKeyName,KEY_READ) )
 {
  TCHAR temp[1024];
  DWORD dwIndex = 0;
  DWORD dwSize = MAX_PATH;
  TCHAR szExtension[MAX_PATH];
  while(ERROR_NO_MORE_ITEMS != regParent.EnumKey(dwIndex,szExtension,&dwSize) )
  {
   dwIndex++;
   dwSize = MAX_PATH;

 

   wcscpy_s(temp,strAllPath);
   wcscat(temp,L"//");
   wcscat(temp,szExtension);

 

   GetDlgItem(IDC_STATIC)->SetWindowTextW(temp);
   EnumKKey(temp,regParent.m_hKey,szExtension);
  }
 }
 regParent.Close();

}

当Open函数中权限值是KEY_READ时无任何问题,更改其它权限则打不开。经过测试,直接用API函数RegOpenEx()也无法在其他权限下打开。或许你会认识这是注册表项的权限问题,或者说这是因为有些注册表项是32-bit的,有些是64-bit的,用32-bit的App无法打开64-bit的注册表项。这或许是原因,但此处不是,此处的原因会给你一个surpising!

 

解决方法

在win7中,微软为提高系统安全引入UAC(User Account Control,用户帐户控制),你所编译的程序应以管理员的身份进行执行,右击你的可执行程序,以管理员身份运行即可。对于编写代码来说,这比叫麻烦。若你用的是Visual Studio 2010,则visual studio 应以管理员身份运行。一劳永逸的方法,右击visual studio 2010,属性,兼容性,以管理员身份执行(UAC控制配置)。意外吧!编程还得用管理员身份,想不到这还有影响。。。。

 

分享一个visual studio 2010的下载地址,有效期大致为今后7天内。

http://www.namipan.com/d/cn_visual_studio_2010_ultimate_x86_dvd_532347.iso/aad7886a44381bfaa5897c14a4edddfba964ffb800d818a0