win7-64位系统用QSettings写注册表

经常使用QT的QSettings了,感觉已经很熟练了,但是突然发现在64位系统上不能写注册表了,最开始我以为是管理员权限的问题,后来编译管理员权限之后发现没有问题,问题出在win7 64位的重定向上了。这是我找的资料,可以参考一下

//试验证明这样调试时没有错误了,但是根本写不了注册表 ( 网上提到)
使用的是64位系统,64位系统有文件重定向的问题。你可以试试取消文件重定向,再修改注册表。
    PVOID OldValue = NULL;
   if( Wow64DisableWow64FsRedirection(&OldValue) ) //取消文件重定向
     {
          //添加修改注册表代码
          //……

          if ( FALSE == Wow64RevertWow64FsRedirection(OldValue) ) //恢复文件重定向
             {
                   return 0;
              }
    }


下面是在64位系统中正确的做法:(实验证明了的)

系统右键菜单写注册表
//QString strValue = m_FileTransMainWnd->m_strAppPath+"/FYSystemRightButtonUploadU.exe %1";//系统右键菜单响应程序转发给主程序
//strValue.replace('/', '\\');
文件
//m_FileTransMainWnd->RegSettings = new QSettings("HKEY_CLASSES_ROOT\\*\\shell\\RYFileTranClient", QSettings::NativeFormat);
//m_FileTransMainWnd->RegSettings->setValue(NULL,m_FileTransMainWnd->m_strRighttext);
//m_FileTransMainWnd->RegSettings = new QSettings("HKEY_CLASSES_ROOT\\*\\shell\\RYFileTranClient\\command", QSettings::NativeFormat);
//m_FileTransMainWnd->RegSettings->setValue(NULL,strValue);
文件夹
//m_FileTransMainWnd->RegSettings = new QSettings("HKEY_CLASSES_ROOT\\Folder\\shell\\RYFileTranClient", QSettings::NativeFormat);
//m_FileTransMainWnd->RegSettings->setValue(NULL,m_FileTransMainWnd->m_strRighttext);
//m_FileTransMainWnd->RegSettings = new QSettings("HKEY_CLASSES_ROOT\\Folder\\shell\\RYFileTranClient\\command", QSettings::NativeFormat);
//m_FileTransMainWnd->RegSettings->setValue(NULL,strValue);
上面的这些在调试时会提示:ASSERT failure in QSettings:"empty key",file io\qsettings.cpp line322
将null换成"."后就可以了,而且可以写注册表
//系统右键菜单写注册表 
QString strValue = m_FileTransMainWnd->m_strAppPath+"/FYSystemRightButtonUploadU.exe %1";//系统右键菜单响应程序转发给主程序
strValue.replace('/', '\\');
//文件
m_FileTransMainWnd->RegSettings = new QSettings("HKEY_CLASSES_ROOT\\*\\shell\\RYFileTranClient", QSettings::NativeFormat);
m_FileTransMainWnd->RegSettings->setValue(".",m_FileTransMainWnd->m_strRighttext);
m_FileTransMainWnd->RegSettings = new QSettings("HKEY_CLASSES_ROOT\\*\\shell\\RYFileTranClient\\command", QSettings::NativeFormat);
m_FileTransMainWnd->RegSettings->setValue(".",strValue);
//文件夹
m_FileTransMainWnd->RegSettings = new QSettings("HKEY_CLASSES_ROOT\\Folder\\shell\\RYFileTranClient", QSettings::NativeFormat);
m_FileTransMainWnd->RegSettings->setValue(".",m_FileTransMainWnd->m_strRighttext);
m_FileTransMainWnd->RegSettings = new QSettings("HKEY_CLASSES_ROOT\\Folder\\shell\\RYFileTranClient\\command", QSettings::NativeFormat);
m_FileTransMainWnd->RegSettings->setValue(".",strValue);


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在打开注册表时,32位程序往往在64为系统上不能直接访问64的路径,都是自动跳到WoW6432Node下面,

在打开注册表时添加“KEY_WOW64_64KEY”标志,就能直接访问64为注册表路径。

LONG lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\***", 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey);
对应的,访问32位注册表示可以加上KEY_WOW64_32KEY“”标志。

LONG lReturn = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\***", 0, KEY_ALL_ACCESS | KEY_WOW64_32KEY, &hKey);


一般情况下32为程序打开注册表示默认“KEY_WOW64_32KEY”标志,访问64位支持注册表时,传个“KEY_WOW64_64KEY”位标志即可,但是经过测试,Window2000的系统是不支持这个标志的,所以32为程序运行在2000的系统或者以下系统时,把这个标志改成“0”即可;


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值