C/C++

С++ Win32 Api Помогите найти ошибку.

С++ Win32 Api Помогите найти ошибку.
Короче видимо ошибки связанные с кодировкой и типами данных wchar_t и char и непониманием как это работает. char - занимает один байт wchar_t - два байта как минимум.
В винапи практически все функции имеют две реализации: одна для символов типа char, вторая для символов типа wchar_t. Например CreateWindowExA - это для символов char, CreateWindowExW - для символов wchar_t. В тот момент, когда вы пишите CreateWindowEx() компилятор выбирает нужную функцию из CreateWindowExA или CreateWindowExW и подставляет ее при компиляции. То есть функции CreateWindowEx без приставки нет, есть либо для char либо для wchar_t. Как же компилятор выбирает какую функцию выбрать!? В visualstudio основная (стартовая) функция называется wWinMain, так вот приставка w в начале как раз и говорит что будет вызываться функции реализованные для wchar_t. Если же написать просто WinMain то, как я понимаю (могу немного ошибаться), будут вызываться те, которые реализованы для char. В компиляторе mingw(который кстати и использует dev-c++) для запуска функций реализованных для wchar_t нужно выставлять флаг компиляции
-municode
(для dev-c++ я не знаю как добавлять флаги компиляции, пользуюсь code::blocks IDE) без этого флага mingw по умолчанию вызывает функции реализованные для char.
А теперь по вашему поводу. LPCWSTR - это указатель на строку у которой символ занимает 2 байта (wchar_t), LPCSTR - указатель на строку у которой символ занимает 1 байт (char). Эти указатели по сути одно и то же, то есть занимают одно и то же количество байт, но вас компилятор предупреждает об ошибке что указывают они не на те строки что вы хотите. То есть первое что вам нужно решить это в каком режиме работает компилятор в wchar_t или в char(я предполагаю что в char). Потом все строки сделать теми, которые и использует функции
"Hello" - char
L"Hello" - wchar_t приставка L переводит символы в wchar_t на этапе компиляции (то есть ее нельзя использовать для конвертации символов на этапе выполнения)
А потом правильно вызывать функции в зависимости от строк. А простая попытка конвертации одного указателя (LPCSTR) в другой (LPCWSTR) как минимум невозможна так как текст все равно остался однобайтовым (char) о чем вас и предупреждает компилятор говоря что не могу конвертировать указатели...
Илья Минеев
Илья Минеев
15 408
Лучший ответ
Отдел Культ, Раз. Язык, Физкульт И Спорт Отдел Культ, Раз. Язык, Физкульт И Спорт Я ему уже давал ссылку на статью https://habr.com/ru/post/164193/ , где всё это объясняется. Чтоб использовались unicode-функции Win API, надо определить макрос UNICODE. Это можно сделать в настройках компилятора или (хуже) написать в самом начале файла
#define UNICODE
Это крутейший редактор! Как он называется? Хочу себе такой
Denis)) K.
Denis)) K.
74 422
Берик Алжанов по-моему это что-то от борланд. Turbo C++ может быть.
и самый прикол - что даже тогдааа, до винды как таковой, уже не писали на WinAPI. а юзали высокоуровневый фреймворк. вот на скрине тому доказательство - по коду видно, что он высокоуровневый и с ООП. Borland Turbo Vision - папа Delphi, и дедушка C# Winforms.
и судя по всему, все это создано одним и тем же сумрачным гением, который автор C# и сначала работал как раз таки в борланде, а потом в M$.
Валера Мальборо Dev-CPP там у него)
Зачем ты приводишь text к LPCWSTR? Ты понимаешь, что это, и зачем оно нужно?
Саша Сафронов Со всем уважением, это код из учебника, в котором изначально компилятор нашел 7 ошибок, но 5 я уже нашел и исправил. С остальными мне нужна помощь более опытных и знающих людей.
Саша Сафронов Я пока не разобрался, но еще подумаю. Может кто-то объяснит более доступно.