Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка в strcpy в VC2005 
V
    Опции темы
torero
Дата 14.4.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

Репутация: нет
Всего: нет



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

 В CMyView.cpp
Код

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

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

Это сообщение отредактировал(а) torero - 14.4.2009, 20:08
PM MAIL   Вверх
Lazin
Дата 14.4.2009, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 2
Всего: 154



в настройках проекта, поменять Character set с Unicode на Not set
PM MAIL Skype GTalk   Вверх
Andrey44
Дата 15.4.2009, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



А еще можно 
Код

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



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Rickert
Дата 15.4.2009, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



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


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
vood
Дата 15.4.2009, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 23.2.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



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

Это сообщение отредактировал(а) vood - 15.4.2009, 08:38


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
Cheloveck
Дата 15.4.2009, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



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

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

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

Это сообщение отредактировал(а) Cheloveck - 15.4.2009, 08:46


--------------------
user posted image
PM Jabber   Вверх
Rickert
Дата 15.4.2009, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: нет
Всего: 52



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

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


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Cheloveck
Дата 16.4.2009, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Цитата

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

Это по факту.
тут написано. Я когда-то читал подобную статью, это кажется она.


--------------------
user posted image
PM Jabber   Вверх
torero
Дата 17.4.2009, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 177
Регистрация: 1.2.2006

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
jonie
Дата 17.4.2009, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата

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.




--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Cheloveck
Дата 17.4.2009, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Цитата

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

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) и буфер автоматически увеличивается.


--------------------
user posted image
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0988 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.