Привет!
Чего-то тут я вообще ничего не понимаю. Вот такой тривиальный код не работает:
CComBSTR bstr="Tra-la-la";
AnsiString s=(BSTR)bstr;
MessageBox(NULL, s.c_str(), "", MB_OK);
Рисует "Tra-la-l", т.е. без последней буквы. Чего за бред?
Здравствуйте, Владик, Вы писали:
В>Чего-то тут я вообще ничего не понимаю. Вот такой тривиальный код не работает:
Я x@#ю дорогая редакция... Вот код из ATL в борландовской поставке (BCB5/6). Баг выделен жирным:
inline BSTR A2WBSTR(LPCSTR lp, int nLen = -1)
{
USES_CONVERSION;
BSTR str = NULL;
int nConvertedLen = MultiByteToWideChar(_acp, 0, lp,
nLen, NULL, NULL)-1;
if (nLen==-1)
nConvertedLen = nConvertedLen -1;
str = ::SysAllocStringLen(NULL, nConvertedLen);
if (str != NULL)
{
MultiByteToWideChar(_acp, 0, lp, -1,
str, nConvertedLen);
}
return str;
}
А вот код из ATL от VC6:
inline BSTR A2WBSTR(LPCSTR lp, int nLen = -1)
{
USES_CONVERSION;
BSTR str = NULL;
int nConvertedLen = MultiByteToWideChar(_acp, 0, lp,
nLen, NULL, NULL)-1;
str = ::SysAllocStringLen(NULL, nConvertedLen);
if (str != NULL)
{
MultiByteToWideChar(_acp, 0, lp, -1,
str, nConvertedLen);
}
return str;
}
Ну и как это называется???
Вообще-то баг здесь:
inline BSTR A2WBSTR(LPCSTR lp, int nLen = -1)
{
USES_CONVERSION;
BSTR str = NULL;
int nConvertedLen = MultiByteToWideChar(_acp, 0, lp,
nLen, NULL, NULL)/* -1 <- BUG fixed */;
if (nLen==-1)
nConvertedLen = nConvertedLen -1;
str = ::SysAllocStringLen(NULL, nConvertedLen);
if (str != NULL)
{
MultiByteToWideChar(_acp, 0, lp, -1,
str, nConvertedLen);
}
return str;
}
более подробно
здесь.
Уже вышла ATL 7.0, но только где ее взять в редакции для BCB не известно.
Здравствуйте, nobody2, Вы писали:
N>Вообще-то баг здесь:
Т.е., борландовцы пытались исправить баг, но сделали еще хуже....