Как конвертировать const char * в const WCHAR *

У меня есть что-то вроде этого:

if(GetFileAttributesW("C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}

Я получаю ошибку: не могу преобразовать const char * в const WCHAR * для аргумента 1 в DWORD GetFileAttributesW (const WCHAR *)

Как конвертировать const char* в const WCHAR*?

1

Решение

Не использовать GetFileAttributesWиспользовать GetFileAttributes, добавлять _T для всех константных строк, и использовать _TCHAR*, А также INVALID_FILE_ATTRIBUES определенно не строка…

if(GetFileAttributes(_T("C:\\Directory"))!= INVALID_FILE_ATTRIBUTES )
{...}

Увидеть Сводка по программированию Unicode.

3

Другие решения

Вы смешиваете текстовые литералы одного вида кодификации с вызовами функций с другим видом кодификации.

Все это замешательство связано с темной цепью #defineс и typedefТо, что Microsoft ставит на его заголовки.

Один из раздражающих трюков Microsoft заключается в объявлении двух вызовов функций, различающихся буквой. A или же W в зависимости от настроек проекта. Есть макрос, который преобразует GetFileAttributes в GetFileAttributesA или же GetFileAttributesW если UNICODE определено.

В вашем случае вы избавляетесь от макроса и вызываете UNICODE версия напрямую (заканчивающаяся буквой W) но в вашем вызове вы используете неширокий литерал, вы можете легко исправить это, добавив L к буквальному (как предложено другими пользователями):

if(GetFileAttributesW(L"C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}

Итак, если вы звоните, версия закончилась A, вы можете использовать неширокий литерал:

if(GetFileAttributesA("C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}

Другой способ исправить это с помощью _T макрос (Проверить этот ответ):

if(GetFileAttributesW(_T("C:\\Directory"))!="INVALID_FILE_ATTRIBUTES") {...}

Но если UNICODE не определено, ваша первоначальная проблема снова возникнет; наконец, вы можете отказаться от способа действий Microsoft и использовать все предоставленные макросы:

// Note the lack of W or A, it's a macro, not a function call!!
if(GetFileAttributes(_T("C:\\Directory"))!="INVALID_FILE_ATTRIBUTES") {...}

Использование двух макросов (тот, который меняется GetFileAttributes с UNICODE или нетUNICODE версия и тот, который добавляет L в буквальном смысле), не нужно беспокоиться о настройках проекта, потому что макросы берет на себя эту ответственность за вас.

Редактировать.

Мой плохой, я почти забыл самую важную часть.

Как указали другие пользователи, вы сравниваете возвращаемое значение GetFileAttributes с текстовым литералом; возвращает DWORD и в соответствии с документацией Microsoft:

DWORD — это 32-разрядное целое число без знака (диапазон: от 0 до 4294967295, десятичное число).

Итак, в конце вы сравниваете целое число с char[24]Сравнение возможно, но оно никогда не будет правдой! Вы должны прочитать о функции и как ее использовать;)

1

Вы пытаетесь сравнить адрес указателей, а не компетентность!

Проверьте функцию: memcmp (…)

0