2009-02-03 2 views
12

Я пытаюсь создать новый раздел реестра в реестре Windows с помощью C++. Вот код, который я до сих пор:Создать новый раздел реестра 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 
    ); 
*/ 

Любые мысли были бы замечательными!

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

+0

Где именно происходит ваша ошибка (предположим, что в вызове RegCreateKeyEx(), но нам не нужно угадывать), и что возвращает GetLastError()? –

+0

Вы собираетесь попытаться удалить ключ, который вы только что создали? –

+1

Вместо REG_OPTION_BACKUP_RESTORE вы должны пройти REG_OPTION_NON_VOLATILE (= 0). Вы можете проконсультироваться о поведении таких параметров из MSDN http://msdn.microsoft.com/en-us/library/ms724844(VS.85).aspx – Ismael

ответ

1

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

+0

Да; вам не нужна только привилегия, но вам нужно явно включить ее с помощью вызова API безопасности; если вы уже этого не знали, вы, вероятно, не хотите его использовать. :) – Nick

+0

Изменено в REG_OPTION_NON_VOLATILE, похоже, оно не исправлено. –

2

Как уже упоминалось, вы указали опцию 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 должен преуспеть. См. Registry Virtualization in 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 является Ленг th данных в байтах, а не символов.

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

+0

Я внес изменения с одним исключением: (_tcslen (data) +1) * sizeof (TCHAR) изменен на (strlen (data) +1) * sizeof (TCHAR), поскольку он не скомпилировал первый способ. Опять же, коды ошибок не вернулись, просто не делают того, чего я ожидаю. Спасибо за подсказки, хотя, кажется, я могу приближаться! –

+0

Добавьте #include , чтобы использовать _tcslen(). – ChrisN

+0

Если Unicode был включен, я не думаю, что 'LPCTSTR data =" "' будет компилироваться. –

13

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

Если вас интересует, вы можете взять entire library here.

+1

Я на самом деле собираюсь взять удар с этим - выглядит очень дружелюбно! –

+1

Нарушена ссылка Registry.cpp, попробуйте вместо этого: http://svn.networkdls.com/svn/OpenSource/@Libraries/NSWFL/NSWFL_Registry.Cpp –

+0

Не определил IsWinNT –