Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: (FAQ) Как преобразовать char[] в LPCWSTR в функции CreateWindow  (Прочитано 36119 раз)
0 Пользователей и 1 Гость смотрят эту тему.
andrystepa
Помогающий

ru
Offline Offline

« : 03-12-2007 19:46 » 

Первый раз решил попробовать написать прогу в чистом WinAPI. Попалась книжка Финогенова "Win32 Основы программирования". Там первая же программа:
Код:
#define STRICT
#include<windows.h>
#include<windowsx.h>

char szClassName[]="MainWindow";
char szTitle[]="Программа 1-1";
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) {
MSG msg;
WNDCLASS wc;
memset(&wc,0,sizeof(wc));
wc.lpfnWndProc=WndProc;
wc.hInstance=hInst;
wc.hIcon=LoadIcon(0,IDI_APPLICATION);
wc.hCursor=LoadCursor(0, IDC_ARROW);
wc.hbrBackground=GetStockBrush(LTGRAY_BRUSH);
wc.lpszClassName=LPCWSTR(szClassName);
RegisterClass(&wc);
HWND hwnd=CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW, 10,10,250,100,HWND_DESKTOP,NULL,hInst,0);
ShowWindow(hwnd,SW_SHOWNORMAL);
while(GetMessage(&msg, NULL,0,0))
DispatchMessage(&msg);
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch(msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return(DefWindowProc(hwnd,msg,wParam,lParam));
}
}
При билде в VisualStudio 2005 выдается ошибка:
Prog1_1.cpp
1>c:\programming\visual studio 2005\projects\program1_1\program1_1\prog1_1.cpp(19) : error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'char [11]' to 'LPCWSTR'
1>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Похожая ошибка выдавалась в строчке, где присваивается значение wc.szClassName, но там удалось ее разрешить. Внутри функции CreateWindow такой финт ушами не проходит - все равно выдается та же самая ошибка. Подскажите, как лечить, и вообще как конвертировать символьные строки в эту самую LPCWSTR (или как ее инициализировать)?
« Последнее редактирование: 04-12-2007 04:38 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 03-12-2007 20:11 » 

а если так

HWND hwnd=CreateWindow(szClassName, (LPCWSTR)szTitle, WS_OVERLAPPEDWINDOW, 10,10,250,100,HWND_DESKTOP,NULL,hInst,0);

только надпись будет косячная всё же , мне кажецо Улыбаюсь

   
Записан

Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 03-12-2007 21:43 » 

Хм, для первой проги, наверное, проще всего будет отключить unicode в проекте. Это в свойствах проекта Configuration Properties -> General нужно поменять Character Set с Use Unicode Character Set на Use Multi-Byte Character Set.

Второй вариант использовать тип не char, а THCAR или _TCHAR. Литеральные константы тогда надо обернуть макросом _T или TEXT. Например   
Код:
_TCHAR szTitle[]=_T("Программа 1-1");

Возможно понадобится подключить tchar.h

И наконец можно проделать прямое преобразование с помощью функций mbtowc() или MultiByteToWideChar(), но так лучше не делать, смысла в данной программе в этом нет.

А еще можно с самого начала поддерживать только юникод. Тогда типы char нужно заменить на wchar_t. А перед определением литеральных констант поставить буковку L. То есть
Код:
L"Программа 1-1"

Offtopic:

Уф, может ответ в FAQ? Столько трудился Улыбаюсь
Поставлю в угол.
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 04-12-2007 04:38 » 

Offtopic:

да запросто Улыбаюсь
Поставлю в угол.

Записан

andrystepa
Помогающий

ru
Offline Offline

« Ответ #4 : 04-12-2007 10:42 » 

Попробовал использовать тип _TCHAR - изменил программу следующим образом:
Код:
#include<tchar.h>

char szClassName[]="MainWindow";
_TCHAR szTitle[]=_T("Программа 1-1");
строку с вызовом функции CreateWindow оставил такую:
Код:
HWND hwnd=CreateWindow(szClassName, szTitle, WS_OVERLAPPEDWINDOW, 10,10,250,100,HWND_DESKTOP,NULL,hInst,0);
При билде опять ошибка:
Error   1   error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'char [11]' to 'LPCWSTR'   c:\programming\visual studio 2005\projects\program2_1\program2_1\program2_1.cpp   20

А вот использование поддержки уникод с самого начала:
Код:

wchar_t szClassName[]=L"MainWindow";
wchar_t szTitle[]=L"Программа 1-1";
(строка с вызовом функции осталась та же) привела к нормальной компиляции без ошибок.
Спасибо за подсказку!
Записан
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 04-12-2007 13:17 » 

Вообще-то странно, что в описании ошибки указан второй параметр. Поскольку первый char надо было тоже заменить на TCHAR. Ну и можно было бы попробовать разные макросы.

Впрочем, навряд ли уже в новых программах придется поддерживать Windows 95/98, в которых нет юникода, поэтому действительно лучше потихоньку переползать на использование только юникода.
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 04-12-2007 20:48 » 

Впрочем, навряд ли уже в новых программах придется поддерживать Windows 95/98, в которых нет юникода

А вот тут ты не прав. Под 9х очень даже юникод хорошо работает. Куда ж без него?
Лекарство называется MSLU. У нас один проект как раз с ним идёт. Немного геморно, но всё работает.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 05-12-2007 18:38 » 

Джон, тем лучше Улыбаюсь Тогда точно можно использовать только юникод Улыбаюсь
Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 05-12-2007 18:47 » new

Тогда точно можно использовать только юникод Улыбаюсь

100% !!! Я уже давно все константные строки только с _T делаю. Жалко только что юникодная компиляция не стоит дефолтом. Всё ещё приходится ручками настраивать.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines