Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с реестром 
V
    Опции темы
NOCaut
Дата 19.5.2011, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



Как прочитать строку с реестра?

Код

wchar_t* GetFolderPath()
{
//Получаем значение параметра
 unsigned wchar_t cData[255]={0};
 DWORD BuffLen = sizeof cData;
 wchar_t string[255]={0};
 HKEY hKey;
  
//Открываем ключ реестра
 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\4shared Sync", NULL, KEY_READ, &hKey) == ERROR_SUCCESS)
   RegQueryValueEx(hKey, TEXT("FolderPath"), NULL, NULL, (LPBYTE)cData, &BuffLen);

  return  _itow(*cData, string, 10);//у меня 1
 //Закрываем ключ реестра
 RegCloseKey(hKey);

}


PM MAIL   Вверх
borisbn
Дата 19.5.2011, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(NOCaut @  19.5.2011,  11:32 Найти цитируемый пост)

return  _itow(*cData, string, 10);//у меня 1 
//Закрываем ключ реестра 
RegCloseKey(hKey);

до этих строк всё правильно и логично. дальше пошла какая-то ахинея.
1. строка после return - RegCloseKey(hKey); - никогда не будет выполнена
2. ф-ция itow преобразовывает число в строку. У тебя же cData - и так строка.
3. возвращать указатель на данные, созданные на стеке нельзя ни в коем случае
Итого, переделать лучше так
Код

const std::wstring GetFolderPath() {
//Получаем значение параметра
 wchar_t cData[255]={0};
 DWORD BuffLen = sizeof( cData );
 HKEY hKey;
  
//Открываем ключ реестра
 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\4shared Sync", NULL, KEY_READ, &hKey) == ERROR_SUCCESS)
   RegQueryValueEx(hKey, TEXT("FolderPath"), NULL, NULL, (LPBYTE)cData, &BuffLen);

  std::wstring w_str( cData );
 //Закрываем ключ реестра
 RegCloseKey(hKey);
  return w_str;
}

Если же есть какое-то непреодолимое требование использовать только Си (Си++ нельзя), то выделять память под строку нужно снаружи ф-ции
Код

bool GetFolderPath( wchar_t * cData, DWORD BuffLen ) {
  bool res = false;
//Получаем значение параметра
 HKEY hKey;
//Открываем ключ реестра
 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\4shared Sync", NULL, KEY_READ, &hKey) == ERROR_SUCCESS) {
   RegQueryValueEx(hKey, TEXT("FolderPath"), NULL, NULL, (LPBYTE)cData, &BuffLen);
   res = true;
 }
 //Закрываем ключ реестра
 RegCloseKey(hKey);
  return res;
}

// вызов:
wchar_t cData[255]={0};
if ( GetFolderPath( cData, sizeof( cData ) ) {
// ok
}
else {
// error
}




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
NOCaut
Дата 19.5.2011, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



Спасибо! Неработает первий споб.
Код

wchar_t * str;
   str =  GetFolderPath();
    MessageBox(0,str,L"",0); 



Это сообщение отредактировал(а) NOCaut - 19.5.2011, 13:48
PM MAIL   Вверх
borisbn
Дата 19.5.2011, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(NOCaut @  19.5.2011,  13:08 Найти цитируемый пост)
Неработает первий споб.

покажи как сделал и что именно не работает: не компилируется или неправильно отрабатывает ?
и что за код ты привёл ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
NOCaut
Дата 19.5.2011, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



Кодом етим я питаюсь посмотреть что я прочитал. Мне ж использовать ето дале
Код

    wchar_t *str = new wchar_t[255];
    str = GetFolderPath();  <<< : error C2440: =: невозможно преобразовать 'std::wstring' в 'wchar_t *'
    MessageBox(0,str,L"",0); 




Это сообщение отредактировал(а) NOCaut - 19.5.2011, 13:50
PM MAIL   Вверх
mekhanikus
Дата 19.5.2011, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

Репутация: нет
Всего: 1



Код

    std::wstring str = GetFolderPath();
    MessageBox(0,str.c_str(),L"FolderPath",0); 


PM MAIL   Вверх
NOCaut
Дата 19.5.2011, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



Вот мой код тоже возвращает хрень:
Код

void mmm()
{
HKEY hkSub = NULL;    
wchar_t buff[80];    
DWORD dwMaxValueLen = sizeof(buff);    

// получить строку из реестра 
RegOpenKeyEx(HKEY_CURRENT_USER,_TEXT("Software\\My Key"),0, KEY_QUERY_VALUE | KEY_READ ,&hkSub);

RegQueryValueExW( hkSub, L"FolderPath",NULL, NULL, (LPBYTE) buff, &dwMaxValueLen);

MessageBox(0,buff,L"",0);

}


Добавлено @ 14:09
Спасибо! mekhanikus

Это сообщение отредактировал(а) NOCaut - 19.5.2011, 14:16
PM MAIL   Вверх
borisbn
Дата 19.5.2011, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(NOCaut @  19.5.2011,  14:08 Найти цитируемый пост)
Вот мой код тоже возвращает хрень:

Может потому, что раньше было
Цитата

RegOpenKeyEx(HKEY_LOCAL_MACHINE ...

а сейчас 
Код

RegOpenKeyEx(HKEY_CURRENT_USER ...

а вообще нужно проверять что возвращает RegOpenKeyEx

и потом, тебе mekhanikus привёл пример использования. Чем не нравится ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mekhanikus
Дата 19.5.2011, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

Репутация: нет
Всего: 1



Имхо, не хватает параметров функции.

Должно быть 9:
Код

RegCreateKeyEx(HKEY_CURRENT_USER,
                    _TEXT("Software\\4shared Sync"),
                    0,
                    "",
                    REG_OPTION_NON_VOLATILE,
                    KEY_READ,
                    NULL,
                    &hKey,
                    NULL);

А у тебя 5.
Код

RegOpenKeyEx(HKEY_CURRENT_USER,
                         _TEXT("Software\\4shared Sync"),
                         0,
                        KEY_QUERY_VALUE | KEY_READ
                        ,&hkSub);

PM MAIL   Вверх
NOCaut
Дата 19.5.2011, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



Да завтикал про ключ. smile  

Мне нужно только wchar_t*

Это сообщение отредактировал(а) NOCaut - 19.5.2011, 14:40
PM MAIL   Вверх
NOCaut
Дата 19.5.2011, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



У вас функция RegCreateKeyEx а у меня  RegOpenKeyEx


Код

 wchar_t* PathW = new wchar_t[80];
 wchar_t* ss;
 std::wstring str = GetFolderPath();
 PathW = str.c_str();  <<<<<<<  error C2440: =: невозможно преобразовать 'const wchar_t *' в 'wchar_t *'




Это сообщение отредактировал(а) NOCaut - 19.5.2011, 14:46
PM MAIL   Вверх
borisbn
Дата 19.5.2011, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(NOCaut @  19.5.2011,  14:15 Найти цитируемый пост)
Мне нужно только wchar_t*

там, где требуется wchar_t* вызываешь std::wstringc_str(), а хранишь в std::wstring


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
NOCaut
Дата 19.5.2011, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



непонимаю  smile 

Юзал str.c_str().... но дале етот результат непроходит входним параметром в мои функции такак я юзаб wchar_t*



Это сообщение отредактировал(а) NOCaut - 19.5.2011, 15:04
PM MAIL   Вверх
mekhanikus
Дата 19.5.2011, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

Репутация: нет
Всего: 1



Цитата(NOCaut @  19.5.2011,  14:42 Найти цитируемый пост)
У вас функция RegCreateKeyEx а у меня  RegOpenKeyEx

Я лоханулся...  smile 

Цитата(NOCaut @  19.5.2011,  14:15 Найти цитируемый пост)
Мне нужно только wchar_t*

Если такая мания у чарам, то придется копировать:
Код

 wchar_t* PathW = new wchar_t[80];
 std::wstring str = GetFolderPath();
 str.copy(PathW,79);

Но возникает головняк с размерами и завершающими нулями.  smile 
Слушайся borisbn!
PM MAIL   Вверх
NOCaut
Дата 19.5.2011, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 5.12.2008

Репутация: нет
Всего: 0



всем спс разобрался

Это сообщение отредактировал(а) NOCaut - 19.5.2011, 16:09
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.