Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > SetConsoleTitle в Visual Studio 2008


Автор: Politexnik 30.7.2008, 00:31
Здрасьте!
Перешел с Visual C++ 6.0 на  Visual Studio 2008.
В 6.0 WinAPI функция  SetConsoleTitle из windows.h работала ПРЕВОСХОДНО.
Так что такой код как
Код

SetConsoleTitle("This is the cоnsole title")

работал без ошибок.
Но в Visual Studio 2008 это все не работает. Выдает ошибку, ругаеется нецензурными словами, типа

error C2664: 'SetConsoleTitleW' : cannot convert parameter 1 from 'const char [28]' to 'LPCWSTR'

Но штука в том, что если отконвертировать старый проект в новый, то эта функция работает.

Помогите пожалуйста разобраться.
Заранее спасибо.

Автор: mrbrooks 30.7.2008, 07:33
Здается мне что вся соль в юникоде  smile

Добавлено через 4 минуты и 19 секунд
Код

SetConsoleTitleA("This is the cоnsole title");


Автор: Andrey44 30.7.2008, 07:48
Все проекты в 2008 студии идут в юникоде(в смысле по-умолчанию, но можно снять птичку smile ), так что лучше делать так:
Код

SetConsoleTitle(L"This is the cоnsole title");

или так:
Код

SetConsoleTitle(_T("This is the cоnsole title"));

Автор: Politexnik 30.7.2008, 08:25
Большое спасибо!!!
Все ОК!!!
Но что меняет буква L или _T  спереди. Кодировку???

И еще один маленький вопросик.
Что такое LPCWSTR и чем отличается от  const char???

Автор: mrbrooks 30.7.2008, 08:30
юникод строка и анси строка.

Цитата

Заглавная буква L перед строковым литералом указывает компилятору, что его надо обрабатывать как Unicode-строку. Тогда, размещая строку в области данных программы, компилятор вставит между всеми символами нулевые байты. Но возникает другая проблема — программа компилируется, только если _UNICODE определен Следовательно, нужен макрос, способный избирательно ставить L перед строковым литералом. Эту работу выполняет макрос _T, также содержащийся в Tchar.h.


Добавлено через 3 минуты и 35 секунд
Обрати внимание на мой пример - функции можно использовать также в зависимости от вида строки - если в анси то функция заканчивается на A, если в юникоде то на W. В общем виде без окончания - будет использоваться то какая кодировка по умолчанию.

Автор: Andrey44 30.7.2008, 09:01
LPCWSTR - это указатель на константную юникодную строку, вот и все отличия от LPCSTR тое-же const char[]

Автор: Igoreck 29.11.2010, 16:23
а можно написать 
Код

SetConsoleTitle(LPCWSTR(NAME_SERVER_SOCKET));


???
у меня так то же работает 

хотя есть интересный момент - когда вводишь название функции, то предлагается только вариант SetConsoleTitle
а когда смотришь ее варианты перегрузки то предлагается или SetConsoleTitleA  или  SetConsoleTitleW



Автор: WhKitten 29.11.2010, 16:54
В свойствах проекта Configuration Properties / General / Character set установить "Use Multi-Byte character set".
Вообще  SetConsoleTitle это макрос, который вызывает SetConsoleTitleA или SetConsoleTitleW. При этом функции для Unicode работают по времени также, как ANSI или даже быстрее - так что вызывать SetConsoleTitleA не имеет смысла. Чтобы в независимости от настроек проекта код компилировался при передаче макросу строки должны быть преобразованы к типу _TCHAR*. Это делает макрос _T или _TEXT. В зависимости от настроек проекта _TCHAR интерпретируется как char или wchar_t.
Поэтому любой код, который вызывает макросы, а не функции (который имеют A или W на конце) без использования макросов _T или _TEXT можно считать неверным. О чём и говорит ошибка.

http://msdn.microsoft.com/ru-ru/library/c426s321.aspx

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