Привести к LPCWSTR? - PullRequest
       20

Привести к LPCWSTR?

6 голосов
/ 20 марта 2009

Я пытаюсь создать (очень) простую Win32-программу с графическим интерфейсом, но по какой-то причине компилятор (я использую VC ++ 2008 Express) хочет вручную типизировать каждую строку или символ * в LPCWSTR:

Я получаю эту ошибку компилятора каждый раз, когда я делаю это, например, я получаю эту ошибку для «Hello» и «Note»:

ошибка C2664: «MessageBoxW»: невозможно преобразовать параметр 2 из «const char [22]» в «LPCWSTR»

Пожалуйста, скажи мне, что мне не нужно кастовать каждый раз, когда я делаю это ...

Вот код:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, "Hello", "Note", MB_OK);
    return 0;
}

Ответы [ 4 ]

14 голосов
/ 20 марта 2009

По умолчанию для новых проектов в VS2008 является создание приложений с поддержкой UNICODE. Вы можете либо изменить это значение по умолчанию и вернуться к использованию приложений ANSI или MBCS (Свойства-> Свойства конфигурации-> Общие-> Набор символов), либо использовать строки Unicode, например:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, L"Hello", L"Note", MB_OK);
    return 0;
}

Do not приведите ваши строки к LPCWSTR, потому что это приведет к неопределенному поведению! Символ не то же самое, что wchar_t!

1 голос
/ 20 марта 2009

Мои воспоминания о программировании на Win32 C туманны, но, насколько я помню, вам нужно начать с обертывания ваших строковых литералов в этот макрос:

_T ( "MyString")

Когда вы создаете Unicode, он будет преобразован в строку Unicode.

Если вы строите только юникод или уверены, что обрабатываете только определенную строку в юникоде, вы можете использовать маркер L "", что и делает макрос _T под обложками.

Возможно, вам потребуется включить заголовок tchar.h.

При программировании на win32 я обычно объявляю строки как TCHAR * sz, чтобы все работало на Win9x почти так же, как на NT / Win2k / XP. (Есть и другие удобные макросы, такие как LPTSTR и т. Д., И MFC содержит несколько простых макросов преобразования для случаев, когда вам действительно нужно выполнить преобразование между ansi и unicode для вызова определенных API).

1 голос
/ 20 марта 2009

Проблема в том, что вы строите для UNICODE и передаете не-Unicode строки.

Попытка:

MessageBox(NULL, L"Hello", L"Note", MB_OK);

или настройте сборку для ANSI / MBCS или изучите использование TCHAR (что является проблемой).

0 голосов
/ 20 марта 2009

Как уже говорили другие посты, вы создаете Unicode-приложение. Вы можете переключаться в проект Unicode и из него в настройках проекта (не забудьте установить его для конфигураций «Debug» и «Release».

Если вы хотите использовать его, вам придется добавить все ваши статические строки с помощью L:

L"Some static string"

Для строк char [] есть метод mbstowcs_s, который используется примерно так:

std::string str; // the string you want to convert

WCHAR wstr[128];
size_t convertedChars = sizeof(wstr)/sizeof(WCHAR);
mbstowcs_s(&convertedChars, wstr, str.c_str(), _TRUNCATE);

Вот как я использовал это в одном из моих проектов. Для точного использования см. MSDN .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...