Невозможно назначить параметр lpCmdLine указателю char*

Этот код запускает приложение для проверки этого параметра:

INT APIENTRY _tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT iShow)
{

    char* szCmdLine = lpCmdLine;

...
}

Ошибка в этой строке: ошибка C2440: «инициализация» не может преобразовать из «LPTSTR» в «char *»


person Endy3k    schedule 04.01.2016    source источник
comment
TCHAR* szCmdLine = lpCmdLine; работает? Afaik LPTSTR состоит из TCHAR, а не char.   -  person Joachim Isaksson    schedule 04.01.2016


Ответы (1)


Это потому, что LPTSTR может быть LPSTR или LPWSTR, учитывая настройки проекта UNICODE. Когда юникод включен, приложение использует LPWSTR, если не LPSTR.

LPSTR — это просто псевдоним для char*. LPWSTR - wchar_t*. T в LPTSTR означает тип TCHAR, определение которого может быть char или wchar_t любым символом UNICODE или _UNICODE, определенным в вашем проекте.

LP означает «длинный указатель», long — это 32-битный адрес памяти. STR - строка.

Итак, давайте опишем LPSTR - "длинный указатель на строку ANSI"; LPWSTR - "длинный указатель на строку широких символов" и LPTSTR - "длинный указатель на строку TCHAR".

К букве W или T можно добавить префикс C, например LPCSTR, LPCTSTR, LPCWSTR, что означает, что эти указатели являются постоянными, например const char* или const wchar_t*.

Итак, ваш код должен выглядеть так:

INT APIENTRY _tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT iShow)
{

    TCHAR* szCmdLine = lpCmdLine;

...
}

or

INT APIENTRY _tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT iShow)
{

    LPTSTR szCmdLine = lpCmdLine;

...
}
person Mykola    schedule 04.01.2016