Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

::RegSetValueEx() - в 98 - ОК, в 2000 не работает

321
08 января 2004 года
Doomych
124 / / 20.01.2000
Почему? Вроде бы MSDN не противоречит, но в Win'98 все работает, а в 2000 - ничего не происходит.
Вот пример:
Цитата:

HKEY hkResult;
CString sDatabasePath = "ХХХХХХХ";
RegSetValueEx(hkResult, "Database Path", 0, REG_SZ, (BYTE*)(LPCTSTR)sDatabasePath, sDatabasePath.GetLength() + 1);

3
08 января 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Doomych
Почему? Вроде бы MSDN не противоречит, но в Win'98 все работает, а в 2000 - ничего не происходит.
Вот пример:



Для начала ты должен получить хендл, который ты обозвал hkResult, с помощью RegOpenKeyEx или RegCreateKeyEx.

Во-вторых определись с чем ты работаешь: с ANSII, Unicode или тем и др. в зависимости от параметров компиляции, т.к. если ты работаешь с Unicode, то данный код неверен семантически и алгоритмически, т.к. "Database Path" не является юникодной строкой, а с помощью sDatabasePath.GetLength()+1 ты не получишь размер в байтах, а лишь в символах.

Кроме того удостоверься, что операция преобразование типа CString::LPCTSTR определена и корректна.

321
08 января 2004 года
Doomych
124 / / 20.01.2000
Цитата:
Для начала ты должен получить хендл, который ты обозвал hkResult, с помощью RegOpenKeyEx или RegCreateKeyEx.

hkResult получен (с помощью RegOpenKeyEx). Я повторюсь: в '98 все работает.

Цитата:
Кроме того удостоверься, что операция преобразование типа CString::LPCTSTR определена и корректна.

Здесь тоже все OK.

Цитата:
Во-вторых определись с чем ты работаешь: с ANSII, Unicode или тем и др. в зависимости от параметров компиляции, т.к. если ты работаешь с Unicode, то данный код неверен семантически и алгоритмически, т.к. "Database Path" не является юникодной строкой, а с помощью sDatabasePath.GetLength()+1 ты не получишь размер в байтах, а лишь в символах.

Честно говоря, я не знаю, ANSII или Unicode у меня - я специально ничего не устанавливал. Судя по некорректной работе, Unicode. А как тогда установить ANSII?

461
09 января 2004 года
gerard
102 / / 20.12.1999
Цитата:
Originally posted by Doomych
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 (Безопасность->Разрешения). Причем, если доступа нет, то никакого специального сообщения при попытке записи не будет.

3
09 января 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Doomych
hkResult получен (с помощью RegOpenKeyEx). Я повторюсь: в '98 все работает.

Здесь тоже все OK.

Честно говоря, я не знаю, ANSII или Unicode у меня - я специально ничего не устанавливал. Судя по некорректной работе, Unicode. А как тогда установить ANSII?



Если у тебя код компилиться, то это точно ANSII, т.к. при Unicode на "Database Path" компилятор споткнулся бы.

А что значит "не работает", какая ошибка возникает (код ошибки)?

321
10 января 2004 года
Doomych
124 / / 20.01.2000
Цитата:
Originally posted by Green
А что значит "не работает", какая ошибка возникает (код ошибки)?


Никаких сообщений, просто параметры в реестре не создаются. Если честно, исследований с помощью FormatMessage я не проводил, а до Win2000 доберусь только в понедельник...

409
11 января 2004 года
Ramzes
163 / / 20.09.2000
А у тебя есть доступ на запись в эту ветвь реестра? В 98-то всем можно записать, а в 2000 не всем...
3
11 января 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Doomych

Никаких сообщений, просто параметры в реестре не создаются. Если честно, исследований с помощью FormatMessage я не проводил, а до Win2000 доберусь только в понедельник...



Надеюсь, ты не ждешь, что тебе покажут диалог об ошибке.
Что возвращает сам метод ?
Что возвращает GetLastError ?

321
12 января 2004 года
Doomych
124 / / 20.01.2000
Цитата:
Originally posted by Green
А у тебя есть доступ на запись в эту ветвь реестра


Есть. Я под Админом, да и пишу в 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);
}

4.8K
12 января 2004 года
Владислав
19 / / 28.09.2003
Цитата:
Originally posted by Doomych

Есть. Я под Админом, да и пишу в 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);
}
321
13 января 2004 года
Doomych
124 / / 20.01.2000
Все заработало. Глубокое мерси!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог