CMimeRawAttachment::Initialize()
if (szDisplayName)
{
// use the user-specified display name
_tcscpy(m_szDisplayName, szDisplayName);
_tcsncpy(m_szDisplayName, szDisplayName, sizeof(szDisplayName)/sizeof(TCHAR));
m_szDisplayName[sizeof(szDisplayName)/sizeof(TCHAR)-1] = 0;
}
Из-за двух последних инструкций длина имени обрезается, до 3-х символов. Причём m_szDisplayName -- TCHAR[_MAX_FNAME].
05.09.05 20:43: Перенесено модератором из 'C/C++. Прикладные вопросы' — Павел Кузнецов
Еще один баг, в том же файле, CMimeAttachment::MakeMimeHeader:
// if no display name is specified, default to "rawdata"
return MakeMimeHeader(header, szBoundary, _T("rawdata"));
а должно быть что-то вроде
return MakeMimeHeader(header, szBoundary, m_szDisplayName[0] ? m_szDisplayName : _T("rawdata"));
Я не понял, я что, единственный, кто это использует? Это я только тестовый пример написал, а мне надо слать HTML-сообщение с правильно вставленными картиками. Сколько там еще багов скрыто... может не стоит этим пользоваться? И если там утечка памяти — для моего приложения это убийственно (постоянно работающий сервис).
И это включенно в комплект VC++ и даже помечено как 7-я версия! Я понимаю, какой-нибудь трудноуловимый баг, но эти говорят о том, что эти классы похоже вообще нормально не тестировали.
Здравствуйте, Кодёнок, Вы писали:
Кё>Я не понял, я что, единственный, кто это использует?
Нет, не единственный

. Я это использовал для отправки по SMTP. Так как искать альтернативы не было времени, всё решилось наследованием, copy/paste и исправлениями в нужных местах. Корявое решение получилось, но для того момента оно вполне подходило.
Кё>И это включенно в комплект VC++ и даже помечено как 7-я версия! Я понимаю, какой-нибудь трудноуловимый баг, но эти говорят о том, что эти классы похоже вообще нормально не тестировали.
Бывает
Здравствуйте, Кодёнок, Вы писали:
Кё>CMimeRawAttachment::Initialize()
Кё>Кё> if (szDisplayName)
Кё> {
Кё> // use the user-specified display name
Кё> _tcscpy(m_szDisplayName, szDisplayName);
Кё> _tcsncpy(m_szDisplayName, szDisplayName, sizeof(szDisplayName)/sizeof(TCHAR));
Кё> m_szDisplayName[sizeof(szDisplayName)/sizeof(TCHAR)-1] = 0;
Кё> }
Кё>
Кё>Из-за двух последних инструкций длина имени обрезается, до 3-х символов. Причём m_szDisplayName -- TCHAR[_MAX_FNAME].
sizeof(szDisplayName)/sizeof(TCHAR) у вас равняется четырем! Потому что sizeof любого указателя в Win32 равен четырем, а szDisplayName у вас скорее всего не массив, а указатель, хоть из приведенного текста этого и не видно.