Форум программистов, компьютерный форум CyberForum.ru

Запись в реестр обрезается - C++

Восстановить пароль Регистрация
 
titans2011
293 / 254 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
06.08.2012, 12:33     Запись в реестр обрезается #1
Всем привет. Пишу программку, которая записывает в реестр указанные пути к файлам. Код такой.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
struct vec
{
...
int length;//длина пути
TCHAR * path;//сам путь
....
};
vec temp;
temp.path =new TCHAR[300];
//дале в path записывается путь
.....
//шаманство начинает тут
Result = RegSetValueEx(key, Name, 0, REG_SZ, (const BYTE*)temp.path, (temp.length+1));
Почему то, при правильной длине пути length и правильном записанном пути в реестр записывается обрывистые пути:
например путь такой:
c:\name.exe
А записалось так:
c:\nam
Как это исправить, не зависит ли это от TCHAR?
P.S. Нашел некую закономерность
Например путь такой:
C:\Program Files\Malwarebytes' Anti-Malware\mbam.exe
Записалось так:
C:\Program Files\Malwareby
Т.е. записалось ровно половина!

Добавлено через 10 минут
Поставил так:
Result = RegSetValueEx(key, Name, 0, REG_SZ, (const BYTE*)temp.path, 2*(temp.length+1));
Все заработало! Но почему? Неужели из-за двух байтной кодировки?

Добавлено через 15 секунд
Поставил так:
Result = RegSetValueEx(key, Name, 0, REG_SZ, (const BYTE*)temp.path, 2*(temp.length+1));
Все заработало! Но почему? Неужели из-за двух байтной кодировки?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2012, 12:33     Запись в реестр обрезается
Посмотрите здесь:

Запись в реестр C++
C++ Реестр!
C++ реестр
C++ Реестр
Запись в реестр C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
06.08.2012, 12:44     Запись в реестр обрезается #2
Ну правильно, у тебя строка TCHAR, а у него код одного символа занимает 2 байта.
И ты указатель на TCHAR взял и в BYTE* преобразовал, в котором символы побайтово извлекаются. Вот и получил. Поидее тебе нужно было преобразовать строку TCHAR в строку BYTE.
Я полагаю что сейчас у тебя в реестре после каждого байта пустой символ, ты его не видишь в текстовом виде, но в дальнейшем это может создать проблемы, например при сравнении строк....
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.08.2012, 12:52     Запись в реестр обрезается #3
Если используется ANSI версия этой функции (если произведен точный вызов RegSetValue или не был объявлен Unicode перед добавлением заголовочного файла WINDOWS.H), парметр lpData должен быть строкой ANSI. Строка преобразовывается в Unicode перед сохранением в реестре.
Может здесь об этом?

Добавлено через 3 минуты
Цитата Сообщение от solar_wind Посмотреть сообщение
Ну правильно, у тебя строка TCHAR, а у него код одного символа занимает 2 байта.
TCHAR это char, занимает 1 байт.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
06.08.2012, 12:54     Запись в реестр обрезается #4
alsav22, Не, вроде если юникод включен, то 2 байта....хотя могу и ошибаться.
titans2011
293 / 254 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
06.08.2012, 12:54  [ТС]     Запись в реестр обрезается #5
Цитата Сообщение от solar_wind Посмотреть сообщение
Я полагаю что сейчас у тебя в реестре после каждого байта пустой символ, ты его не видишь в текстовом виде, но в дальнейшем это может создать проблемы, например при сравнении строк....
Пустого символа действительно не видно, но сейчас я буду писать функционал на извлечение адреса, вот и посмотрю, правильно ли извлекается.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.08.2012, 12:56     Запись в реестр обрезается #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Строка преобразовывается в Unicode перед сохранением в реестре.
Может из-за этого? Поэтому строка в реестре занимает места в два раза больше.

Добавлено через 1 минуту
Цитата Сообщение от solar_wind Посмотреть сообщение
alsav22, Не, вроде если юникод включен, то 2 байта....хотя могу и ошибаться.
Если включен, то да. А у ТС включен?
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
06.08.2012, 12:58     Запись в реестр обрезается #7
alsav22, Ну так это только он может сказать.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.08.2012, 13:01     Запись в реестр обрезается #8
Цитата Сообщение от solar_wind Посмотреть сообщение
alsav22, Ну так это только он может сказать.
Так я у него и спрашиваю. И как length устанавливается? И какими символами путь пишется: расширенными или обычными?
titans2011
293 / 254 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
06.08.2012, 13:12  [ТС]     Запись в реестр обрезается #9
Я пишу на WinApi и действительно работаю с юникодом.

Добавлено через 8 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
И как length устанавливается? И какими символами путь пишется: расширенными или обычными?
C++
1
2
3
4
5
6
int length = SendMessage(hEdit1, WM_GETTEXTLENGTH, 0, 0);
    TCHAR *pBuffer = new TCHAR[length + 1];
        GetWindowText(hEdit1, pBuffer, length + 1);
.....
wcscat(temp.path,pBuffer );
temp.length=length;
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.08.2012, 13:13     Запись в реестр обрезается #10
И ещё вопрос к ТС: такое приведение для чего сделано?
(const BYTE*)temp.path
titans2011
293 / 254 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
06.08.2012, 13:15  [ТС]     Запись в реестр обрезается #11
Цитата Сообщение от alsav22 Посмотреть сообщение
И ещё вопрос к ТС: такое приведение для чего сделано?
Так у меня в учебнике написанно. Чесно, сам не знаю.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.08.2012, 13:29     Запись в реестр обрезается #12
Я бы размер length проверил(cout << temp.length). Если работа идёт с расширенными символами и всё правильно, то размер length должен быть в два раза больше, чем символов в пути.

Добавлено через 1 минуту
Цитата Сообщение от titans2011 Посмотреть сообщение
Так у меня в учебнике написанно. Чесно, сам не знаю.
А если не делать, то ошибка?
titans2011
293 / 254 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
06.08.2012, 14:09  [ТС]     Запись в реестр обрезается #13
Цитата Сообщение от alsav22 Посмотреть сообщение
А если не делать, то ошибка?
Без ошибка:
error C2664: RegSetValueExW: невозможно преобразовать параметр 5 из "TCHAR *" в "const BYTE *"

Добавлено через 27 минут
А вот теперь вытащить эту строку проблема, не записывает в PathName.
C++
1
2
TCHAR *PathName=new TCHAR[temp.length+1];
    Result=RegQueryValueEx(key, Name, 0, 0, (BYTE*)PathName, &len);
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.08.2012, 14:13     Запись в реестр обрезается #14
Получается, что эта функция:
C++
1
int length = SendMessage(hEdit1, WM_GETTEXTLENGTH, 0, 0);
возвращает не то, что должно быть. Из-за этого дальше происходят ошибки с размером пути.
titans2011
293 / 254 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
06.08.2012, 14:35  [ТС]     Запись в реестр обрезается #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Получается, что эта функция:
C++
1
int length = SendMessage(hEdit1, WM_GETTEXTLENGTH, 0, 0);
возвращает не то, что должно быть. Из-за этого дальше происходят ошибки с размером пути.
Да все правильно она возвращает. length = количеству символов в строке.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2012, 14:57     Запись в реестр обрезается
Еще ссылки по теме:

Реестр С++ C++
C++ Реестр
Очередная запись в реестр - изменения не вносятся C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.08.2012, 14:57     Запись в реестр обрезается #16
Теперь понятно. В этой функции: RegSetValueEx(), последний параметр - размер данных (в байтах), что не сответствует количеству символов в строке Юникода.
Yandex
Объявления
06.08.2012, 14:57     Запись в реестр обрезается
Ответ Создать тему
Опции темы

Текущее время: 19:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru