Обернуть голову вокруг windows.h - const char * против LPSTR - PullRequest
0 голосов
/ 02 февраля 2011

Я начинаю работать со следующим простым приложением в окне сообщения. Проблема в том, что когда я запускаю это приложение, текст на китайском языке. У меня явно есть проблема с кодировкой. Может кто-нибудь указать мне куда-нибудь, где я могу узнать о специфичных для windows.h строках typedefs?

// test.c

#include <windows.h>

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

Ответы [ 3 ]

3 голосов
/ 02 февраля 2011

При использовании Windows API (почти) каждое объявление со строкой, заканчивающейся нулем, использует TCHAR, LPTSTR и LPCTSTR, которые определяются как char, char* и const char*, когда вы не здание с UNICODE в качестве набора символов и определяются как wchar_t, wchar_t* и const wchar_t* при сборке с набором символов UNICODE.

Кроме того, определения UNICODE и / или _UNICODE определяют, какая функция компилируется при вызове функции windows-API. Почти каждая функция имеет две версии: одну для UNICODE и одну для не-UNICODE.

например, MessageBox переводится либо в MessageBoxA (не UNOCODE-версия), либо в MessageBoxW (UNOCDE-версия).

Дальше больше:

int WINAPI WinMain ( HINSTANCE hInstance ,HINSTANCE hPrevInstance ,LPSTR lpCmdLine, int nCmdShow ) 
{
// ...
}

часто определяется как:

int WINAPI _tWinMain ( HINSTANCE hInstance ,HINSTANCE hPrevInstance ,LPTSTR lpCmdLine ,int nCmdShow ) 
{
// ...
}

для последней версии вам нужно включить <tchar.h>, который имеет правильный перевод для _ tWinMain (или _ tmain при сборке consle-app).

Надеюсь, это что-то искажает для вас.

0 голосов
/ 02 февраля 2011
#include <windows.h>

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

Скорее всего, проблема заключается в том, что вы создаете приложение UNICODE и передаете указатели на строки символов, когда API хочет указатели на строки wchar_t

0 голосов
/ 02 февраля 2011

Скорее всего, проблема с широким и обычным символами.Попробуйте изменить код на:

#include <windows.h>

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

Если это решит вашу проблему, это означает, что ваш проект настроен на широкие символы, а не на обычные символы.Добавление L перед строковой константой сделает ее широкой символьной константой.Как правило, это хорошая вещь, поскольку легче управлять интернационализацией для приложения с широким набором символов.

Эти веб-страницы более подробно описывают API-интерфейс Windows и Unicode:

http://msdn.microsoft.com/en-us/library/ff381407(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/dd374089(v=vs.85).aspx

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