2009-02-03 109 views
12

我想在使用C++的Windows註冊表中創建一個新的註冊表項。這裏是我的代碼至今:使用C++創建一個新的Windows註冊表項

HKEY hKey; 
    LPCTSTR sk = TEXT("SOFTWARE\\OtherTestSoftware"); 

    LONG openRes = RegCreateKeyEx(
      HKEY_LOCAL_MACHINE, 
      sk, 
      0, 
      NULL, 
      REG_OPTION_BACKUP_RESTORE, 
      KEY_ALL_ACCESS, 
      NULL, 
      &hKey, 
      NULL); 

    if (openRes==ERROR_SUCCESS) { 
     printf("Success creating key."); 
    } else { 
     printf("Error creating key."); 
    } 

    LPCTSTR value = TEXT("OtherTestSoftwareKey"); 
    LPCTSTR data = "OtherTestData\0"; 

    LONG setRes = RegSetValueEx (hKey, value, 0, REG_SZ, (LPBYTE)data, strlen(data)+1); 

    if (setRes == ERROR_SUCCESS) { 
     printf("Success writing to Registry."); 
    } else { 
     printf("Error writing to Registry."); 
    } 

    //RegDeleteKey(hKey, sk); 

    LONG closeOut = RegCloseKey(hKey); 

    if (closeOut == ERROR_SUCCESS) { 
     printf("Success closing key."); 
    } else { 
     printf("Error closing key."); 
    } 

我能夠成功地打開使用非常相似的代碼片段現有的密鑰(基本上與RegOpenKeyEx取代RegCreateKeyEx)。我會想象一下,我傳遞給RegCreateKeyEx的一個或多個參數會導致這個問題。我真的不確定哪裏的事情可能會被玷污,因爲我所陷入的所有錯誤代碼都顯示出成功。作爲參考,這裏是RegCreateKeyEx函數簽名:

/* 
* LONG WINAPI RegCreateKeyEx(
     __in  HKEY hKey, 
     __in  LPCTSTR lpSubKey, 
     __reserved DWORD Reserved, 
     __in_opt LPTSTR lpClass, 
     __in  DWORD dwOptions, 
     __in  REGSAM samDesired, 
     __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
     __out  PHKEY phkResult, 
     __out_opt LPDWORD lpdwDisposition 
    ); 
*/ 

任何想法將是巨大的!

感謝, 布賴恩

+0

你的錯誤發生在哪裏(我假設在RegCreateKeyEx()調用中,但我們不應該猜測),以及GetLastError()返回的是什麼? – 2009-02-03 19:52:34

+0

您是否打算嘗試刪除剛剛創建的密鑰? – 2009-02-03 19:54:58

+1

而不是REG_OPTION_BACKUP_RESTORE您應該通過REG_OPTION_NON_VOLATILE(= 0)。您可以參考MSDN上的這些選項的行爲http://msdn.microsoft.com/en-us/library/ms724844(VS.85).aspx – Ismael 2009-02-03 20:01:55

回答

1

第一條線索是你的REG_OPTION_BACKUP_RESTORE使用。您可能不想使用該標誌,因爲我認爲它需要事先需要啓用的特殊「備份」權限。普通應用程序不會希望這樣做。

2

如上所述,您在RegCreateKeyEx的調用中指定了REG_OPTION_BACKUP_RESTORE選項,這意味着您要打開密鑰才能執行備份或恢復。通常情況下,您可以使用REG_OPTION_NON_VOLATILE

你正在運行什麼操作系統?在Windows 2000/XP中,HKEY_LOCAL_MACHINE註冊表配置單元不可由非管理員用戶寫入,因此RegCreateKeyEx將因拒絕訪問錯誤(錯誤5)而失敗。這也適用於Vista,如果您的應用程序在其清單中有requestedExecutionLevel條目。如果您運行的是Vista,並且您的應用程序未指定requestedExecutionLevel(或者它根本沒有清單),則訪問HKEY_LOCAL_MACHINE將被虛擬化,因此RegCreateKeyEx應成功。有關更多詳細信息,請參閱MSDN中的Registry Virtualization in Windows Vista

您發佈的代碼還存在一些問題,只有在您定義的UNICODE編譯項目時纔會顯現出來。這條線:

LPCTSTR data = "OtherTestData\0"; 

應該

LPCTSTR data = TEXT("OtherTestData\0"); 

這行:

LONG setRes = RegSetValueEx(hKey, value, 0, REG_SZ, 
    (LPBYTE)data, _tcslen(data)+1); 

應該是:

LONG setRes = RegSetValueEx(hKey, value, 0, REG_SZ, 
    (LPBYTE)data, (_tcslen(data)+1) * sizeof(TCHAR)); 

因爲RegSetValueExcbData參數是冷以字節爲單位的數據,而不是字符。

我希望這有助於!

13

我一直在編譯我自己的個人函數庫多年。其中一部分完全涉及註冊表訪問,請參閱CreateRegistryKey函數Registry.Cpp文件。

如果你有興趣,你可以抓住entire library here