Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Ошибка в strcpy в VC2005


Автор: torero 14.4.2009, 20:07
   В программе написанной в 6-ой студии есть такие операторы:
   CString m_strText;   // описана в документе.

 В CMyView.cpp
Код

   LPSTR pText=(LPSTR)::GlobalLock(hText);
   strcpy(pText, GetDocument->m_strText);

Работает нормально, но когда я эту же программу набираю с клавиатуры в VC++2005, то оператор strcpy выдаёт ошибку, что
   невозможно преобразовать параметр 2 из 'CString' в 'const char * '
 Наверно это из-за Юникода, но что делать?

Автор: Lazin 14.4.2009, 20:38
в настройках проекта, поменять Character set с Unicode на Not set

Автор: Andrey44 15.4.2009, 07:24
А еще можно 
Код

LPSTR pText=(LPSTR)::GlobalLock(hText);
   strcpy(pText, CW2A(GetDocument->m_strText));

Автор: Rickert 15.4.2009, 07:47
А ещё вообщем-то надо вызывать метод GetBuffer() у CString'а.

Автор: vood 15.4.2009, 08:35
Использование m_strText.c_str() преобразует m_strText в const char *.
Только тип m_strText должон быть string.

Автор: Cheloveck 15.4.2009, 08:44
Проще всего использовать _tcscpy() из tchar.h и строки LPTSTR, а в литералах применять макрос типа _T("string"). Тогда компилироваться будит либо всё в юникод, либо всё в анси, в зависимости от параметров компилятора и объявленных макросов, и проблем не возникнет.
Цитата

А ещё вообщем-то надо вызывать метод GetBuffer() у CString'а. 

GetBuffer надо вызывать когда копируешь в CString, из него не нужно, так как первым элементом в классе всегда является указатель на строку и любая функция воспримет CString как обычную строку. 

Автор: Rickert 15.4.2009, 09:16
Цитата(Cheloveck @  15.4.2009,  08:44 Найти цитируемый пост)
GetBuffer надо вызывать когда копируешь в CString, из него не нужно, так как первым элементом в классе всегда является указатель на строку и любая функция воспримет CString как обычную строку. 

Это по стандарту? Первый раз слышу.

Автор: Cheloveck 16.4.2009, 11:33
Цитата

Это по стандарту? Первый раз слышу. 

Это по факту.
http://www.sofmos.com/lyosha/Articles/cstring.html написано. Я когда-то читал подобную статью, это кажется она.

Автор: torero 17.4.2009, 07:54
      Проверил все предложенные советы. Лучше всего мне подошла комбинация из двух:
      strcpy_s(pText,GlobalSize(hText),CW2A(pDoc->m_strText)); 
  Всем большое спасибо за помощь. К сожалению "плюс" можно поставить только один.

Автор: jonie 17.4.2009, 09:09
Цитата

GetBuffer надо вызывать когда копируешь в CString, из него не нужно, так как первым элементом в классе всегда является указатель на строку и любая функция воспримет CString как обычную строку. 
зачем такой изврат, если есть:
Цитата

CSimpleStringT::operator PCXSTR 
Directly accesses characters stored in a CSimpleStringT object as a C-style string.
operator PCXSTR( ) const throw( );
PCXSTR cast operator may be invoked implicitly.


PCXSTR это typedef -- A pointer to a constant string.


Автор: Cheloveck 17.4.2009, 12:28
Цитата

зачем такой изврат, если есть:
Цитата

CSimpleStringT::operator PCXSTR 
Directly accesses characters stored in a CSimpleStringT object as a C-style string.
operator PCXSTR( ) const throw( );
PCXSTR cast operator may be invoked implicitly.

PCXSTR это typedef -- A pointer to a constant string.



GetBuffer позволяет вернуть массив любого размера, т.е. если у тебя буфер 10 символов, но ты хочешь записать 110, то говоришь, GetBuffer(110) и буфер автоматически увеличивается.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)