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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
titans2011
295 / 256 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
#1

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

06.08.2012, 12:33. Просмотров 815. Ответов 15
Метки нет (Все метки)

Всем привет. Пишу программку, которая записывает в реестр указанные пути к файлам. Код такой.
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++
Создал CLR приложение...добавил файл Settings.h и засунул туда следующий код void SaveSet() { HKEY hKey=0; ...

Очередная запись в реестр - изменения не вносятся - C++
Всем привет! Столкнулся с такой проблемой - вот код на C++: #include <Windows.h> int WinMain(HINSTANCE, HINSTANCE, LPSTR, int) ...

Обрезается файл после экстренного выключения ПК - C++
Доброго времени суток! Есть программа которая сохраняет результаты в .txt файл к примеру, через каждые 10 секунд (как автосейв). Все бы...

Реестр С++ - C++
Здравствуйте. У меня такой вопрос: Есть два консольных приложения С ++ одно выводит элементы массива, другое выполняет действия над его...

Реестр - C++
Не могу открыть реестр пишет заблокировано администратором

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,967
Завершенные тесты: 1
06.08.2012, 12:44     Запись в реестр обрезается #2
Ну правильно, у тебя строка TCHAR, а у него код одного символа занимает 2 байта.
И ты указатель на TCHAR взял и в BYTE* преобразовал, в котором символы побайтово извлекаются. Вот и получил. Поидее тебе нужно было преобразовать строку TCHAR в строку BYTE.
Я полагаю что сейчас у тебя в реестре после каждого байта пустой символ, ты его не видишь в текстовом виде, но в дальнейшем это может создать проблемы, например при сравнении строк....
alsav22
5416 / 4812 / 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
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,967
Завершенные тесты: 1
06.08.2012, 12:54     Запись в реестр обрезается #4
alsav22, Не, вроде если юникод включен, то 2 байта....хотя могу и ошибаться.
titans2011
295 / 256 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
06.08.2012, 12:54  [ТС]     Запись в реестр обрезается #5
Цитата Сообщение от solar_wind Посмотреть сообщение
Я полагаю что сейчас у тебя в реестре после каждого байта пустой символ, ты его не видишь в текстовом виде, но в дальнейшем это может создать проблемы, например при сравнении строк....
Пустого символа действительно не видно, но сейчас я буду писать функционал на извлечение адреса, вот и посмотрю, правильно ли извлекается.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.08.2012, 12:56     Запись в реестр обрезается #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Строка преобразовывается в Unicode перед сохранением в реестре.
Может из-за этого? Поэтому строка в реестре занимает места в два раза больше.

Добавлено через 1 минуту
Цитата Сообщение от solar_wind Посмотреть сообщение
alsav22, Не, вроде если юникод включен, то 2 байта....хотя могу и ошибаться.
Если включен, то да. А у ТС включен?
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,967
Завершенные тесты: 1
06.08.2012, 12:58     Запись в реестр обрезается #7
alsav22, Ну так это только он может сказать.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.08.2012, 13:01     Запись в реестр обрезается #8
Цитата Сообщение от solar_wind Посмотреть сообщение
alsav22, Ну так это только он может сказать.
Так я у него и спрашиваю. И как length устанавливается? И какими символами путь пишется: расширенными или обычными?
titans2011
295 / 256 / 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
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.08.2012, 13:13     Запись в реестр обрезается #10
И ещё вопрос к ТС: такое приведение для чего сделано?
(const BYTE*)temp.path
titans2011
295 / 256 / 43
Регистрация: 27.09.2010
Сообщений: 1,058
06.08.2012, 13:15  [ТС]     Запись в реестр обрезается #11
Цитата Сообщение от alsav22 Посмотреть сообщение
И ещё вопрос к ТС: такое приведение для чего сделано?
Так у меня в учебнике написанно. Чесно, сам не знаю.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.08.2012, 13:29     Запись в реестр обрезается #12
Я бы размер length проверил(cout << temp.length). Если работа идёт с расширенными символами и всё правильно, то размер length должен быть в два раза больше, чем символов в пути.

Добавлено через 1 минуту
Цитата Сообщение от titans2011 Посмотреть сообщение
Так у меня в учебнике написанно. Чесно, сам не знаю.
А если не делать, то ошибка?
titans2011
295 / 256 / 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
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.08.2012, 14:13     Запись в реестр обрезается #14
Получается, что эта функция:
C++
1
int length = SendMessage(hEdit1, WM_GETTEXTLENGTH, 0, 0);
возвращает не то, что должно быть. Из-за этого дальше происходят ошибки с размером пути.
titans2011
295 / 256 / 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++
Скажем есть ключ реестра HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\SessionManager\Environment в regedit нашел что переменная path...

Реестр - C++
Написать программу, определяющую значение параметра в открытом разделе и изменяющую это значение на другое. Подскажите пожалуйста, где-то...

реестр - C++
не могу найти исходники программы на visual c++ которые бы добавляли программу в авто запуск реестров и какую библиотек для этого надо...

Реестр! - C++
Нужно програмно изменить в реестре значение параметра...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru