簡體   English   中英

使用c ++創建一個新的Windows注冊表項

[英]Create a new windows registry key using c++

我正在嘗試使用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
    );
 */

任何想法都會很棒!

謝謝,布賴恩

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

如果您有興趣,可以在這里獲取整個圖書館

如前所述,您所指定的REG_OPTION_BACKUP_RESTORE在調用選項RegCreateKeyEx ,這意味着你為了執行備份或還原打開鍵。 通常,您將使用REG_OPTION_NON_VOLATILE

你在運行什么操作系統? 在Windows 2000 / XP中, HKEY_LOCAL_MACHINE注冊表配置單元不能由非管理員用戶寫入,因此RegCreateKeyEx將失敗並顯示拒絕訪問錯誤(錯誤5)。 如果您的應用程序在其清單中有requestedExecutionLevel條目,這也適用於Vista。 如果您正在運行Vista,並且您的應用程序未指定requestedExecutionLevel (或者它根本沒有清單),則對HKEY_LOCAL_MACHINE訪問將被虛擬化,因此RegCreateKeyEx應該成功。 有關詳細信息,請參閱MSDN 中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));

因為cbData在參數RegSetValueEx是數據的以字節為單位,而不是以字符的長度。

我希望這有幫助!

第一個線索是您使用REG_OPTION_BACKUP_RESTORE 您可能不想使用該標志,因為我認為它需要一個特殊的“備份”權限,您需要事先啟用它。 普通應用程序不希望這樣做。

這可能是您無法使用代碼創建新密鑰原因

這些鏈接可能會有所幫助。

http://www.codeguru.com/forum/archive/index.php/t-378884.html
http://www.codeguru.com/forum/archive/index.php/t-275250.html

作為旁注,請始終嘗試使用GetLastError()來獲取錯誤消息。

我沒有測試過他們中的任何一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM