Создайте новый ключ реестра Windows, используя C ++ - PullRequest
14 голосов
/ 03 февраля 2009

Я пытаюсь создать новый раздел реестра в реестре Windows, используя C ++. Вот код, который у меня есть:

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.");
    }

Я могу успешно открыть существующий ключ, используя очень похожий фрагмент кода (в основном заменить RegCreateKeyEx на RegOpenKeyEx) Я полагаю, что один или несколько аргументов, которые я передаю в 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
    );
 */

Любые мысли были бы великолепны!

спасибо, Брайен

Ответы [ 4 ]

16 голосов
/ 03 февраля 2009

Я собираю свою собственную библиотеку функций в течение многих лет. Одна часть этого полностью посвящена доступу к реестру, см. Функцию CreateRegistryKey в файле Registry.Cpp .

Если вам интересно, вы можете взять всю библиотеку здесь .

3 голосов
/ 03 февраля 2009

Как уже упоминалось, вы указали опцию REG_OPTION_BACKUP_RESTORE в вызове RegCreateKeyEx, что означает, что вы открываете ключ для выполнения резервного копирования или восстановления. Обычно вместо этого вы используете REG_OPTION_NON_VOLATILE.

В какой операционной системе вы работаете? В Windows 2000 / XP куст реестра HKEY_LOCAL_MACHINE недоступен для записи пользователям, не являющимся администраторами, поэтому RegCreateKeyEx завершится с ошибкой отказа в доступе (ошибка 5). Это также относится к Vista, если в вашем манифесте есть запись requestedExecutionLevel. Если вы используете Vista, и ваше приложение не указывает requestedExecutionLevel (или вообще не имеет манифеста), доступ к HKEY_LOCAL_MACHINE будет виртуализирован, поэтому RegCreateKeyEx должен завершиться успешно. Подробнее см. Виртуализация реестра в Windows Vista в MSDN.

Есть еще несколько проблем с кодом, который вы разместили, который станет очевидным, только если вы скомпилируете свой проект с определением 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 - это длина данных в байтах, а не в символах.

Надеюсь, это поможет!

2 голосов
/ 03 февраля 2009

Первая подсказка - использование вами REG_OPTION_BACKUP_RESTORE. Вы, вероятно, не хотите использовать этот флаг, так как я считаю, что для этого требуется специальная привилегия «резервного копирования», которую необходимо включить заранее. Обычные приложения не захотят этого делать.

0 голосов
/ 30 мая 2011

Вероятно, это причина, по которой вы не можете создать новый ключ с вашим кодом.

Эти ссылки могут быть полезны.

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

В качестве идентификатора всегда пробуйте GetLastError (), чтобы получить сообщение об ошибке.

Я не проверял ни один из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...