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”即可;


你可能感兴趣的:(qt,注册表)