2012-02-06 39 views
1

我試圖找到使用註冊表的Excel的路徑,並試圖調整我在互聯網上找到的一些代碼。我正在使用64位Win7,並確認使用regedit的關鍵在那裏。試圖通過搜索註冊表找到excel的路徑

#include <windows.h> 

#include <iomanip> 
#include <iostream> 

using namespace std; 

int main() 
{ 
HKEY hKey = 0; 
char buf[255] = {0}; 
DWORD dwType = 0; 
DWORD dwBufSize = sizeof(buf); 
const char* subkey = "SOFTWARE\\Classes\\Excel.Application\\CLSID"; 

if(RegOpenKey(HKEY_LOCAL_MACHINE,subkey,&hKey) == ERROR_SUCCESS) 
{ 
    dwType = REG_SZ; 
    if(RegQueryValueEx(hKey,"default",0, &dwType, (BYTE*)buf, &dwBufSize) == ERROR_SUCCESS) 
    { 
     cout << "key value is '" << buf << "'\n"; 
    } 
    else 
     cout << "can not query for key value\n"; 
    RegCloseKey(hKey); 

} 
else 
    cout << "Can not open key\n"; 
cin.ignore(); 

return 0; 
} 

有誰知道這是爲什麼不工作? 謝謝 James

+1

執行程序時會發生什麼錯誤消息。 – vikky 2012-02-06 12:51:18

+0

你的程序是32位還是64位? – 2012-02-06 13:34:45

+0

它是64位的,問題不在於出現錯誤「RegOpenKey」沒有設置hKey。 – James 2012-02-06 16:07:39

回答

1

嘗試改變

RegQueryValueEx(hKey,"default",0, &dwType, (BYTE*)buf, &dwBufSize) == ERROR_SUCCESS) 

RegQueryValueEx(hKey, NULL, 0, &dwType, (BYTE*)buf, &dwBufSize) == ERROR_SUCCESS) 

如果你想在‘默認’值,你應該通過NULL或lpValueName字段中的空字符串

另外,如果您的應用程序不是64位並且您在64位操作系統中運行,則應該檢查RegOpenKeyEx函數上的KEY_WOW64_64KEY標誌,有權訪問你想要的密鑰。

1

幾乎所有的Windows API函數,當失敗時,通過調用GetLastError()獲得更多細節,可以設置更詳細的錯誤代碼。撥打RegOpenKey()後,您應該致電此問題。

在您的示例中,RegOpenKey()可能因拒絕訪問錯誤而失敗。 RegOpenKey()用完全讀/寫/刪除權限打開註冊表項。 Windows 7上的標準用戶在HKLM上沒有寫入或刪除訪問權限,因此RegOpenKey()將失敗。

您應該改爲使用RegOpenKeyEx(),它可讓您指定只讀訪問權限,如下所示。

RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkey, 0, KEY_READ, &hKey) 

PS。當提問像上面那樣的問題時,你應該更加描述代碼的失敗。在上面的例子中,你應該包括哪些行/函數調用失敗。例如,「當我使用此代碼,調用RegOpenKey失敗。

+0

感謝您的快速響應!我嘗試過實施您的更改,但沒有任何更改。該程序一直運行。我已經包含「std :: cout <<」Here「<< GetLastError()<< std :: endl;」低於RegOpenKeyEx,但它只是顯示「這裏0」,我認爲沒有錯誤發生。當我用調試器通過它時,在RegOpenKeyEx行之後,hkey變量的值爲「未使用???」當我按下加號時,它說「錯誤:表達式不能被評估,我認爲這意味着hkey永遠不會被加載? – James 2012-02-06 13:50:38

相關問題