Обнаружил, что в одной моей 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. Поэтому, если нужно в цикле обтриммить кучу строк, то лучше создать локаль перед началом цикла.