Ответ 1
Я составлял свою личную библиотеку функций в течение многих лет. Одна часть этого полностью связана с доступом к реестру, см. Функцию CreateRegistryKey в файле Registry.Cpp.
Если вы заинтересованы, вы можете получить здесь всю библиотеку.
Я пытаюсь создать новый раздел реестра в реестре 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.");
}
Я могу успешно открыть существующий ключ, используя очень похожий фрагмент кода (в основном заменить 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
);
*/
Любые мысли были бы замечательными!
спасибо, Брайен
Я составлял свою личную библиотеку функций в течение многих лет. Одна часть этого полностью связана с доступом к реестру, см. Функцию CreateRegistryKey в файле Registry.Cpp.
Если вы заинтересованы, вы можете получить здесь всю библиотеку.
Как уже упоминалось, вы указали опцию REG_OPTION_BACKUP_RESTORE
в вызове RegCreateKeyEx
, что означает, что вы открываете ключ для выполнения резервного копирования или восстановления. Обычно вместо REG_OPTION_NON_VOLATILE
используйте 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
- это длина данных в байтах, а не символы.
Надеюсь, это поможет!
Первый ключ - это использование 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(), чтобы получить сообщение об ошибке.
Я не тестировал ни один из них.