Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Прикол с WINVER (число прочтений - 3442 )
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Прикол с WINVER
24. Апреля 2008 :: 18:41
Печать  
Обнаружил, что в одной моей dll-ке перестал работать boost::trim_right. Или приводит к AV или просто не тримает. Сначала решил было забить и сделать собственный аналог trim_right, но потом решил все же разобраться. Т.к. сильно похоже на порчу памяти, то, скорее всего, дело в каком-то глючном коде.

Вставил в DllMain такой код:
Код
Выбрать все
		std::string test ("gfgfgfgfg		  ");
		boost::trim_right (test);
		test += "-";
		::MessageBox (0, test.c_str (), "", 0);
 


Он должен выдавать строку "gfgfgfgfg-". В реальности он выдавал либо AV, либо "gfgfgfgfg              -". Стал выкидывать из проекта cpp-файлы (могла глючить инициализация какой-нибудь статической переменной). Выкидывал, выкидывал - выкинул вообще все нафиг, кроме процедуры DllMain. Ничего не изменилось Улыбка

Стал крутить настройки проекта - ничего не влияет. Стал сравнивать stdafx.h с вариантом из рабочей dll и уменьшать различия. Все нормально заработало после закомментаривания строки:
Код
Выбрать все
#define WINVER 0x0400 



Проект создавался изначально в 2005-й Студии и эту строку вставил тамошний мастер. Примечательно, что эта dll совершенно нормально работала до установки нового PSDK. Так что, бойтесь люди WINVER'а Улыбка

Кстати, boost::trim_right при отсутствии второго параметра создает новую std::locale. Поэтому, если нужно в цикле обтриммить кучу строк, то лучше создать локаль перед началом цикла.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Прикол с WINVER
Ответ #1 - 24. Апреля 2008 :: 20:32
Печать  
Чем же boost::trim_right так это версия не угодила? Нерешительный
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Прикол с WINVER
Ответ #2 - 25. Апреля 2008 :: 08:27
Печать  
kms писал(а) 24. Апреля 2008 :: 20:32:
Чем же boost::trim_right так это версия не угодила? Нерешительный

Когда оно работало, но не триммило, то выражалось это в несрабатывании такого кода:
Код
Выбрать все
std::use_facet< std::ctype<CharT> >(m_Locale).is( m_Type, Ch ) 


где m_Type - std::ctype_base::space
m_Locale - std::locale
Ch - текущий символ строки

внутри символ использовался как индекс в некоторой таблице. Соответственно, можно было бы ожидать там 256 элементов. В дампе памяти в этой таблице был какой-то мусор - например, имена реквизитов формы 1С.

А когда оно падало, то обрезаемая строка частично забивалась мусором.

В общем, ХЗ, что это за ботва. Возможно, какие-то проблемы с хипом при этом значении WINVER начинаются.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Прикол с WINVER
Ответ #3 - 25. Апреля 2008 :: 09:16
Печать  
Наверное, Бустовцы забыли о Вин98 и ВинНТ Улыбка - 400 вроде их параметр
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Прикол с WINVER
Ответ #4 - 25. Апреля 2008 :: 18:19
Печать  
artbear писал(а) 25. Апреля 2008 :: 09:16:
Наверное, Бустовцы забыли о Вин98 и ВинНТ Улыбка - 400 вроде их параметр

Буст здесь вообще не причем. Я же написал,  что проблема связана с локалями. А это STLport.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать