В своей функции Win32 (ANSI) я нахожусь в тупике:
(Многобайтовый набор символов НЕ ЮНИКОД)
void sOut( HWND hwnd, string sText ) // Add new text to EDIT Control
{
int len;
string sBuf, sDisplay;
len = GetWindowTextLength( GetDlgItem(hwnd, IDC_EDIT_RESULTS) );
if(len > 0)
{
// HERE:
sBuf.resize(len+1, 0); // Create a string big enough for the data
GetDlgItemText( hwnd, IDC_EDIT_RESULTS, (LPSTR)sBuf.data(), len+1 );
} // MessageBox(hwnd, (LPSTR)sBuf.c_str(), "Debug", MB_OK);
sDisplay = sBuf + sText;
sDisplay = sDisplay + "\n\0"; // terminate the string
SetDlgItemText( hwnd, IDC_EDIT_RESULTS, (LPSTR)sDisplay.c_str() );
}
Это должно добавлять текст к элементу управления при каждом вызове.
Вместо этого происходит сбой конкатенации всех строк после вызова GetDlgItemText()
, я полагаю, из-за приведения типа?
Я использовал три строковые переменные, чтобы сделать это действительно очевидным. Если затронуто sBuf
, то sDisplay не должно быть затронуто.
(Кроме того, почему len 1 char меньше длины в буфере?)
GetDlgItemText()
корректно возвращает содержимое элемента управления EDIT, и SetDlgItemText () правильно установит любой текст в sDisplay
, но сцепление между ними просто не происходит.
Это "скрытая особенность" класса строк?
Добавлено:
Да, похоже, проблема в том, что NUL завершается в середине. Теперь понятно почему лен +1. Функция гарантирует, что последний символ является NUL.
Использование sBuf.resize(len);
отрубит его, и все хорошо.
Добавлено:
Чарльз,
Оставляя в стороне причудливую возвращаемую длину этой конкретной функции, и поговорим об использовании строки в качестве буфера:
Стандарт описывает возвращаемое значение basic_string :: data () как указатель на массив, члены которого равны элементам самой строки.
Это именно то, что нужно, не так ли?
Кроме того, требуется, чтобы программа не изменяла ни одно из значений этого массива.
Насколько я понимаю, это изменится вместе с гарантией того, что все байты смежны. Я забыл, где читал длинную статью об этом, но MS уже реализует это, как он утверждал.
Что мне не нравится в использовании вектора, так это то, что байты копируются дважды, прежде чем я смогу их вернуть: один раз в вектор и снова в строку. Мне также нужно создать экземпляр векторного объекта и строкового объекта. Это много накладных расходов. Если бы была какая-то строка, удобная для работы с векторами (или CStrings) без обращения к старым функциям C или копированию символов один за другим, я бы использовал их. Таким образом, строка очень удобна для синтаксиса.