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


Автор: susanin 20.4.2007, 16:09
попробовал сделать MessageBox, но при компиляции выдались ошибки... написал вот так..
Код

void CnewDlg::OnBnClickedCancel()
{
    MessageBox("Первое сообщение","message",0);
    // TODO: Add your control notification handler code here
    OnCancel();
}

ошибка выдается следующая:
 error C2664: 'CWnd::MessageBoxW' : cannot convert parameter 1 from 'const char [17]' to 'LPCTSTR'
в чем ошибка то????

Автор: scooper 20.4.2007, 17:31
Может на русский язык ругается! попробуй убрать

Автор: dizzy1984 20.4.2007, 19:41
Цитата(susanin @  20.4.2007,  16:09 Найти цитируемый пост)
error C2664: 'CWnd::MessageBoxW
 У тебя юникод стоит в настройках, убери его.

Либо предваряй все строковые константы символом L

Автор: susanin 20.4.2007, 23:29
dizzy1984 , а как юникод в настройках убрать?

Автор: zkv 22.4.2007, 00:51
Цитата(susanin @  20.4.2007,  23:29 Найти цитируемый пост)
dizzy1984 , а как юникод в настройках убрать? 

поиском по форуму

Автор: Dude03 22.4.2007, 10:48
Вроде так
Код

#ifdef UNICODE
#undef UNICODE
#endif

Автор: Earnest 23.4.2007, 10:02
Dude03, нет конечно, не путай новичка! Это придется делать в каждом файле.
susanin, Юникод убирается в свойствах проекта, 100 раз обсуждалось, ищи по форуму.

Автор: Rapalex 23.4.2007, 12:16
А я бы не советовал отключать уникод, мы уже в 21-м веке!!!!!!!!!!!
Нутолько так написать:
Код

MessageBox(_T("Первое сообщение"), _T("message"),0);

В результате этот макрас сам поставил L если надо а не надо от него вреда не будет, и будет легко собтрать то уникод то не укод (мульти байт) приложения.

Автор: Любитель 23.4.2007, 12:17
Earnest, надо какую нибудь тему по юникоду или прикрепить, или в шапку добавить smile А то это вечный вопрос по VC++ 2005.

Автор: zkv 23.4.2007, 12:43
Цитата(Rapalex @  23.4.2007,  12:16 Найти цитируемый пост)
Нутолько так написать:

согласен, заметил что в МСДН'овских сэмплах используется макрос TEXT() и определен он вроде также как и _T(), кто-нибудь знает в чем разница между ними?

Автор: Любитель 23.4.2007, 13:00
zkv, отличие очень тонкое. У MS есть два макроса для юникода/неюникода:
1. UNCIDOE - PSDK (Platform SDK - Windows SDK) для WinAPI функций.
2. _UNICODE- в CRT (C Runtime) для всяких _tprintf, _tcsclen и пр.

Для первого в winnt.h определяется макрос TEXT, именно он рекомендуется к использованию (так как фнукциями WinAPI пользуются чаще, хотя правда вряд ли кто-то будет определять юникод для одного и запрещать для другого  smile ). Для последнего - в tchar.h есть _T и _TEXT.

Вот так. Когда в пропертях проекта ставим юникод - в команд-лайн компилера добавляется /DUNICODE и /D_UNICODE. Потому (дополнительно) явные дефайны не рулят - надо знать, что делаем и для чего.

Автор: Rapalex 24.4.2007, 11:16
Любитель, спасибо, не знал, ещё думал в чём же разница.

Только напрашивается вопрос, что такое CRT (C Runtime)? В смысле что мне с него идёт.

Автор: Tectoder 25.4.2007, 23:38
Цитата(Любитель @  23.4.2007,  13:00 Найти цитируемый пост)
UNICODE- в CRT (C Runtime) для всяких _tprintf, _tcsclen и пр.
CRT это набор библиотек с функциями языка C.

Автор: Любитель 28.4.2007, 16:40
Tectoder, и?

_tprintf, _tcslen - это мс-шное расширение CRT. Находятся они в msvcrxx.dll (MS Visual C Runtime). Точнее не они, а printf, wprintf и т. д. А это просто макросы, раскрываемые в printf/wprintf, etc. согласно #ifdef UNICODE.

Автор: zkv 28.4.2007, 19:05
Цитата(Любитель @  28.4.2007,  16:40 Найти цитируемый пост)
Tectoder, и?

видимо это был ответ на вопрос:
Цитата(Rapalex @  24.4.2007,  11:16 Найти цитируемый пост)
Любитель, спасибо, не знал, ещё думал в чём же разница.
Только напрашивается вопрос, что такое CRT (C Runtime)? 

smile

Автор: Любитель 28.4.2007, 19:07
Блин, сорри, не заметил. По цитате решил, что претензии к тому, что _tprintf и т. д. - не стандартная библиотека сей.

Автор: DigitSphinx 29.4.2007, 15:09
Кстати на счет UNICODE вопросик такой , почему если его поменять на Multi-Byte (в настройках) то манифест не крепится к EXE’шнику, т.е. форма становится не в стиле XP

Автор: Greeen 29.4.2007, 17:50
DigitSphinx, а ты посмотри в stdafx.h
Код

#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif

Вот тебе и ответ

Автор: Любитель 29.4.2007, 19:10
Официально commctl32.dll версии 6 и больше не поддерживает юникод. В МСДН читаем, что в текущей версии в принципе будет раюотать и Анси, но в принципе сие не гарантируется.

ЗЫ Где-то я про это уже говорил.

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