1. 程式人生 > >win7-64位系統用QSettings寫登錄檔

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