Бросок к LPCWSTR?

Из спецификации (раздел 7.20.3)

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

[Emphasis mine]

Таким образом, упомянутые значения являются только минимальными значениями. Реализация может иметь большие ограничения. Я ожидал бы, что ptrdiff_t будет длиной слова целевой платформы (то есть 64-битного типа 64-битных систем).

И обратите внимание, что size_t является целым типом без знака , а ptrdiff_t является целым типом со знаком . Этот тип подразумевает, что не все значения size_t могут быть представлены ptrdiff_t.

6
задан JasonTrue 20 March 2009 в 19:47
поделиться

4 ответа

Значение по умолчанию для новых проектов в 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;
}

Не бросайте свои строки к LPCWSTR, потому что это приведет к неопределенному поведению! Символ не является тем же как wchar_t!

14
ответ дан 8 December 2019 в 14:47
поделиться

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

Попытка:

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

или настроенный Ваша сборка для ANSI/MBCS или изучает использование TCHARs (которые являются болью).

1
ответ дан 8 December 2019 в 14:47
поделиться

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

_T ("mystring")

При создании unicode это будет преобразовано в строку unicode.

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

Вы, возможно, должны включать tchar.h заголовок.

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

1
ответ дан 8 December 2019 в 14:47
поделиться

Как другие сказанные сообщения, Вы создаете приложение Unicode. Можно переключиться на, и из проекта Unicode в настройках проекта (не забывайте устанавливать его и для конфигураций "Отладки" и для "Выпуска".

Если Вы хотите использовать его, необходимо будет предварительно ожидать все статические строки с L:

L"Some static string"

Для символа [] строки там являются методом 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.

0
ответ дан 8 December 2019 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: