::RegSetValueEx() - в 98 - ОК, в 2000 не работает
Вот пример:
HKEY hkResult;
CString sDatabasePath = "ХХХХХХХ";
RegSetValueEx(hkResult, "Database Path", 0, REG_SZ, (BYTE*)(LPCTSTR)sDatabasePath, sDatabasePath.GetLength() + 1);
Почему? Вроде бы MSDN не противоречит, но в Win'98 все работает, а в 2000 - ничего не происходит.
Вот пример:
Для начала ты должен получить хендл, который ты обозвал hkResult, с помощью RegOpenKeyEx или RegCreateKeyEx.
Во-вторых определись с чем ты работаешь: с ANSII, Unicode или тем и др. в зависимости от параметров компиляции, т.к. если ты работаешь с Unicode, то данный код неверен семантически и алгоритмически, т.к. "Database Path" не является юникодной строкой, а с помощью sDatabasePath.GetLength()+1 ты не получишь размер в байтах, а лишь в символах.
Кроме того удостоверься, что операция преобразование типа CString::LPCTSTR определена и корректна.
hkResult получен (с помощью RegOpenKeyEx). Я повторюсь: в '98 все работает.
Здесь тоже все OK.
Честно говоря, я не знаю, ANSII или Unicode у меня - я специально ничего не устанавливал. Судя по некорректной работе, Unicode. А как тогда установить ANSII?
hkResult получен (с помощью RegOpenKeyEx). Я повторюсь: в '98 все работает.
hkResult лучше сразу присваивать одно из возможных значений: HKEY_CLASSES_ROOT, HKEY_CURRENT_CONFIG, HKEY_CURRENT_USER,
HKEY_LOCAL_MACHINE или HKEY_USERS (в Win2000 еще можно HKEY_PERFORMANCE_DATA). С учетом этого исправления, ваш код у меня работает и под 2000.
Кстати, раз вы работаете в Win2k, то какие у вас права. Если не админовские, то вы не в каждый раздел реестра можете писать (скорее всего, только в HKEY_CURRENT_USER). Это можно узнать с помощью программы regedt32 (Безопасность->Разрешения). Причем, если доступа нет, то никакого специального сообщения при попытке записи не будет.
hkResult получен (с помощью RegOpenKeyEx). Я повторюсь: в '98 все работает.
Здесь тоже все OK.
Честно говоря, я не знаю, ANSII или Unicode у меня - я специально ничего не устанавливал. Судя по некорректной работе, Unicode. А как тогда установить ANSII?
Если у тебя код компилиться, то это точно ANSII, т.к. при Unicode на "Database Path" компилятор споткнулся бы.
А что значит "не работает", какая ошибка возникает (код ошибки)?
А что значит "не работает", какая ошибка возникает (код ошибки)?
Никаких сообщений, просто параметры в реестре не создаются. Если честно, исследований с помощью FormatMessage я не проводил, а до Win2000 доберусь только в понедельник...
Никаких сообщений, просто параметры в реестре не создаются. Если честно, исследований с помощью FormatMessage я не проводил, а до Win2000 доберусь только в понедельник...
Надеюсь, ты не ждешь, что тебе покажут диалог об ошибке.
Что возвращает сам метод ?
Что возвращает GetLastError ?
А у тебя есть доступ на запись в эту ветвь реестра
Есть. Я под Админом, да и пишу в HKEY_CURRENT_USER. Да и ключи создаются без проблем.
Что возвращает GetLastError ?
RegSetValueEx возвращает 5.
При этом GetLastError возвращает 0!
На всякий случай приведу весь кусок кода:
// Работа с реестром
// Если ключа еще нет, создаем его
char cClassName[50] = ""; // класс создаваемого ключа реестра
HKEY hkResult = HKEY_CURRENT_USER; // дескриптор ключа реестра
unsigned long lDisposition; // информация о том, что произошло с ключом реестра
SECURITY_ATTRIBUTES secAttr;
secAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
secAttr.lpSecurityDescriptor = NULL;
secAttr.bInheritHandle = TRUE;
// Пытаемся создать ключ (смотрим, может, он уже есть)
RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Doomych\\OTTS", 0, cClassName, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE | KEY_CREATE_SUB_KEY, &secAttr, &hkResult, &lDisposition);
if ( lDisposition == REG_CREATED_NEW_KEY ) // =1 (если ключ только что создан)
{
// Создаем и заполняем раздел "Database" - расположение БД и SQL-запросы
RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Doomych\\OTTS\\Database", 0, cClassName,
REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE | KEY_CREATE_SUB_KEY, &secAttr, &hkResult, &lDisposition);
RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Doomych\\OTTS\\Database", 0, KEY_READ, &hkResult);
// Путь к базе данных
CString sDatabasePath = "F:\\!Проекты\\Otts\\!OTTS - источник данных\\Сертификаты.mdb";
LONG lll = RegSetValueEx(hkResult, "Database Path", 0, REG_SZ, (BYTE*)(LPCTSTR)sDatabasePath, sDatabasePath.GetLength() + 1);
......
RegCloseKey(hkResult);
}
Есть. Я под Админом, да и пишу в HKEY_CURRENT_USER. Да и ключи создаются без проблем.
RegSetValueEx возвращает 5.
При этом GetLastError возвращает 0!
Код 5 - это Access is denied.
GetLastError всегда будет возвращать 0 после вызова этой функции.
// Если ключа еще нет, создаем его
char cClassName[50] = ""; // класс создаваемого ключа реестра
HKEY hkResult = HKEY_CURRENT_USER; // дескриптор ключа реестра
unsigned long lDisposition; // информация о том, что произошло с ключом реестра
SECURITY_ATTRIBUTES secAttr;
secAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
secAttr.lpSecurityDescriptor = NULL;
secAttr.bInheritHandle = TRUE;
// Пытаемся создать ключ (смотрим, может, он уже есть)
RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Doomych\\OTTS", 0, cClassName, REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE | KEY_CREATE_SUB_KEY, &secAttr, &hkResult, &lDisposition);
if ( lDisposition == REG_CREATED_NEW_KEY ) // =1 (если ключ только что создан)
{
// Создаем и заполняем раздел "Database" - расположение БД и SQL-запросы
RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\Doomych\\OTTS\\Database", 0, cClassName,
REG_OPTION_NON_VOLATILE, KEY_READ | KEY_WRITE | KEY_CREATE_SUB_KEY, &secAttr, &hkResult, &lDisposition);
// Зачем ты второй раз открываешь ключ? Он уже открыт, ты же только что его создал и его handle лежит в hkResult. Но если тебе так нравится, то открой еко с правом доступа - KEY_WRITE.
RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Doomych\\OTTS\\Database", 0, KEY_READ, &hkResult);
// Путь к базе данных
CString sDatabasePath = "F:\\!Проекты\\Otts\\!OTTS - источник данных\\Сертификаты.mdb";
LONG lll = RegSetValueEx(hkResult, "Database Path", 0, REG_SZ, (BYTE*)(LPCTSTR)sDatabasePath, sDatabasePath.GetLength() + 1);
......
RegCloseKey(hkResult);
}