Может быть сообщение не совсем по теме, но всё же спрошу —
самое дурное (на мой взгляд) в C++ — subj, поделитесь, что
вы используете с WTL: TCHAR*, string или CString? Конкретнее,
меня интересуют 2 пункта:
1. Работа со строками неограниченной переменной длины, причём
используюя WTL-классы (например мне не нравится след код, может
быть и кривой:
TCHAR * str;
//....
int Len=m_Edit.GetWindowTextLength();
free(str);//вот тут м.б ошибка если пер. не инициализировна
str=malloc(sizeof(TCHAR)*(Len+1));
m_Edit.GetWindowText(str,Len+1);
2. Возврат строковых переменных из процедуры(как в возвращаемом
значении функции, так и в изменяемом её параметре).
Если кто может подсказать ссылку на доку в Инете по этому поводу-
буду несказанно рад!
Да ещё хочу подчеркнуть, что буферы фиксированной длины не подходят.
Заранее спасибо!
Re: Строки в C++
От:
Аноним
Дата:
04.07.01 08:00
Оценка:
А что нужно то, нет всё понятно, но что конкретно? )))
Re: Строки в C++
От:
Аноним
Дата:
04.07.01 09:07
Оценка:
Здравствуйте Niemiets, вы писали:
N>Может быть сообщение не совсем по теме, но всё же спрошу - N>самое дурное (на мой взгляд) в C++ — subj, поделитесь, что N>вы используете с WTL: TCHAR*, string или CString? Конкретнее, N>меня интересуют 2 пункта: N>1. Работа со строками неограниченной переменной длины, причём N>используюя WTL-классы (например мне не нравится след код, может N>быть и кривой:
N>TCHAR * str; N>//.... N>int Len=m_Edit.GetWindowTextLength(); N>free(str);//вот тут м.б ошибка если пер. не инициализировна N>str=malloc(sizeof(TCHAR)*(Len+1)); N>m_Edit.GetWindowText(str,Len+1);
N>2. Возврат строковых переменных из процедуры(как в возвращаемом N>значении функции, так и в изменяемом её параметре).
N>Если кто может подсказать ссылку на доку в Инете по этому поводу- N>буду несказанно рад! N>Да ещё хочу подчеркнуть, что буферы фиксированной длины не подходят. N>Заранее спасибо!
CComBSTR и все просто!!!
1. В WTL есть чувствительные к корректному TCHAR DDX макросы межу CEdit и CComBSTR
DDX_TEXT(IDC_MYEDIT, bstrMyBSTR);
(независимо от размераTCHAR)
2.
void MyProc(BSTR* pbstrResult)
{
CComBSTR bstrMyBstr = L"The result";
Здравствуйте Аноним, вы писали: А>CComBSTR и все просто!!!
Спасибки, вроде правда просто, надо попробовать, но тогда в догонку вопрос:
а как ещё их писать в файлы пропроще (чем ReadFile)?
в WTl-ных ресурсах кругом говорят: используйте XML!
А примеров кот наплакал! Точнее я не одного нормального не видал.
А в файле будут храниться числа(double) и строки.
N>в WTl-ных ресурсах кругом говорят: используйте XML! N>А примеров кот наплакал! Точнее я не одного нормального не видал. N>А в файле будут храниться числа(double) и строки.
А>CComBSTR и все просто!!!
попробовал — полнейшая ерунда про просто!
Внутри DDX_TEXT(точнее CWindow::GetWindowText(BSTR*))примерно такой же код, что я приводил. Но полнейшая ерунда возникает, когда CComBSTR в других функциях испльзовать приходится( к примеру CWindow::SetWindowText) — они LPCSTR требуют, т.е. никакой полседовательности в параметрах!!! Поэтому на данный момент я принял решение использовать TCHAR* и мучаться с выделением и уничтожением памяти. А по поводу XML статью я читал, но хотелось бы чего-нибудь более серёзного, e.g. какую-нибудь прогу, чтоб что-нибудь(настройки к примеру) реально как XML хранила.
Re[3]: Строки в C++
От:
Аноним
Дата:
05.07.01 10:20
Оценка:
Здравствуйте Niemiets, вы писали:
А>>CComBSTR и все просто!!! N>попробовал — полнейшая ерунда про просто! N>Внутри DDX_TEXT(точнее CWindow::GetWindowText(BSTR*))примерно такой....
В WTL (в файле atlmisc.h) есть CString такой-же как в MFC (кроме этого там есть всекие CRect,
CSize и т.д) так этот CString можно использовать вместе с WTL-ными классами в стиле MFC.
Кроме этого в ATL (в файле atlconv.h) объявлено куча макросов для преобразования
(OLE2T, T2OLE, T2BSTR и т.д), кроме этого CString можно инициализировать BSTR строкой
Правда в классе CWindow придется всеже использовать просто LPTSTR.
в простых случаях можно писать:
если лень писать free после malloc распределяй память функцией void *_alloca( size_t size ),
при этом память выдиляется на стеке и автоматически освобождается при выходе из функции.
с помощю этой функции можно написать макрос типа GET_WINDOW_TEXT(m_Edit, str)
Здравствуйте Dimonira, вы писали:
D>А есть вот еще _bstr_t, у него есть и операторы _bstr_t::wchar_t*, _bstr_t::char*
Уж больно кривая это щнука. Она хранит строку сразу в двух пердставлениях A и OLESTR, и по полной програме цепляет CRT.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Строки в C++
От:
Аноним
Дата:
06.07.01 09:09
Оценка:
Здравствуйте Niemiets, вы писали:
А>>CComBSTR и все просто!!! N>попробовал — полнейшая ерунда про просто! N>Внутри DDX_TEXT(точнее CWindow::GetWindowText(BSTR*))примерно такой же код, что я приводил. Но полнейшая ерунда возникает, когда CComBSTR в других функциях испльзовать приходится( к примеру CWindow::SetWindowText) — они LPCSTR требуют, т.е. никакой полседовательности в параметрах!!! Поэтому на данный момент я принял решение использовать TCHAR* и мучаться с выделением и уничтожением памяти. А по поводу XML статью я читал, но хотелось бы чего-нибудь более серёзного, e.g. какую-нибудь прогу, чтоб что-нибудь(настройки к примеру) реально как XML хранила.
Здравствуйте Аноним, вы писали: А>Без истерик, юноша! А>... А>CComBSTR bstrText; А>USES_CONVERSION; А>m_edMyEdit.GetWindowText(&bstrText); А>m_edMyEdit.SetWindowText(W2T(bstrText)); А>.... А>CComBSTR и все просто!!!
А спрашивается на кой лад эта лишняя конверсия, тьу, преобразование, если в большинстве функций LPCSTR? Вот CascString попробую, вроде попродуманнее штука, хотя документации на библиотеку — лишь исходный текст.
Re[5]: Строки в C++
От:
Аноним
Дата:
06.07.01 12:27
Оценка:
Здравствуйте Niemiets, вы писали:
N>Здравствуйте Аноним, вы писали: А>>Без истерик, юноша! А>>... А>>CComBSTR bstrText; А>>USES_CONVERSION; А>>m_edMyEdit.GetWindowText(&bstrText); А>>m_edMyEdit.SetWindowText(W2T(bstrText)); А>>.... А>>CComBSTR и все просто!!!
N>А спрашивается на кой лад эта лишняя конверсия, тьу, преобразование, если в большинстве функций LPCSTR? Вот CascString попробую, вроде попродуманнее штука, хотя документации на библиотеку — лишь исходный текст.
Потому, что UI надо писать быстро и ясным, лего читаемым и форматированым кодом.
В большинтсве функций не LPCSTR, а LPTSTR! Код вверху портабилен между unicode/non-unicode.
А>Потому, что UI надо писать быстро и ясным, лего читаемым и форматированым кодом.
Полностью согласен! А>В большинтсве функций не LPCSTR, а LPTSTR! Код вверху портабилен между unicode/non-unicode.
Ну и тут нечего сказать,
меня неустраивает 1 — почему в одном месте BSTR, а в другом LPTSTR и зачем перегонять из одного в другое? Ладно ещё в COM, там без BSTR никуда, но в оконных-то процедурах зачем такую путаницу устраивать и лишний, никому не нужный код для конвертации пихать в макросы?
Так CascString от и есть TCHAR. Как и CString. CComBSTR для копирований и конкатинаций — это не лучший выбор. Погляди как там все написоно!!!
CComBSTR это класный хелпер для наботы с BSTR, но не для работы со строками.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Строки в C++
От:
Аноним
Дата:
09.07.01 02:53
Оценка:
Здравствуйте Niemiets, вы писали:
N>Может быть сообщение не совсем по теме, но всё же спрошу - N>самое дурное (на мой взгляд) в C++ — subj, поделитесь, что N>вы используете с WTL: TCHAR*, string или CString? Конкретнее, N>меня интересуют 2 пункта: N>1. Работа со строками неограниченной переменной длины, причём N>используюя WTL-классы (например мне не нравится след код, может N>быть и кривой:
N>TCHAR * str; N>//.... N>int Len=m_Edit.GetWindowTextLength(); N>free(str);//вот тут м.б ошибка если пер. не инициализировна N>str=malloc(sizeof(TCHAR)*(Len+1)); N>m_Edit.GetWindowText(str,Len+1);
N>2. Возврат строковых переменных из процедуры(как в возвращаемом N>значении функции, так и в изменяемом её параметре).
N>Если кто может подсказать ссылку на доку в Инете по этому поводу- N>буду несказанно рад! N>Да ещё хочу подчеркнуть, что буферы фиксированной длины не подходят. N>Заранее спасибо!
I do it this way:
#ifdef _UNICODE
typedef std::basic_string<wchar_t> tstring
#else
typedef std::string tstring
#endif
Здравствуйте Niemiets, вы писали:
N>Может быть сообщение не совсем по теме, но всё же спрошу - N>самое дурное (на мой взгляд) в C++ — subj, поделитесь, что N>вы используете с WTL: TCHAR*, string или CString? Конкретнее, N>меня интересуют 2 пункта: N>1. Работа со строками неограниченной переменной длины, причём N>используюя WTL-классы (например мне не нравится след код, может N>быть и кривой:
N>TCHAR * str; N>//.... N>int Len=m_Edit.GetWindowTextLength(); N>free(str);//вот тут м.б ошибка если пер. не инициализировна N>str=malloc(sizeof(TCHAR)*(Len+1)); N>m_Edit.GetWindowText(str,Len+1);
вообще этот код должен выглядеть так
TCHAR * str = NULL;
//....
int Len=m_Edit.GetWindowTextLength();
if( str )
delete[] str;//вот тут не будет ошибки если корретно все писать
str=new TCHAR[ Len+1 ];
m_Edit.GetWindowText(str,Len+1);
N>2. Возврат строковых переменных из процедуры(как в возвращаемом N>значении функции, так и в изменяемом её параметре).
как ни крути, а если функция (не твоя ) принимает указатель на буффер и ожидает, что под него выделена память
то прежде чем передать туда строку под нее нужно выделить память, чем бы ты не пользовался, string? CString или char *.
В своих. соотвтетственно, можешь делать как хочешь.
N>Если кто может подсказать ссылку на доку в Инете по этому поводу- N>буду несказанно рад! N>Да ещё хочу подчеркнуть, что буферы фиксированной длины не подходят. N>Заранее спасибо!
если работы со строками не много, то TCHAR *, вполне подходит, только надо почитать как с ним работать.
есть string от STL (определены +=, и еще несколько удобных вещей );
раз уж форум по ATL/WTL :), то еще есть тип BSTR, и его обертка CComBSTR, только, опять же надо внимательно почитать про работу с ними.
в крайнем случае, свой класс строки пишется за час.
Здравствуйте Dimonira, вы писали:
D>А есть вот еще _bstr_t, у него есть и операторы _bstr_t::wchar_t*, _bstr_t::char*
Для ATL у _bstr_t один недостаток — он использует exceptions, так что его можно только использовать с включенной в компиляторе потдержкой exceptions, что в общем случае приводит к увеличению получаемой ATL компоненты.