У меня есть что-то вроде этого:
if(GetFileAttributesW("C:\\Directory")!="INVALID_FILE_ATTRIBUTES") {...}
Я получаю ошибку: не могу преобразовать const char * в const WCHAR * для аргумента 1 в DWORD GetFileAttributesW (const WCHAR *)
Как конвертировать const char*
в const WCHAR*
?
Не использовать GetFileAttributesW
использовать GetFileAttributes
, добавлять _T
для всех константных строк, и использовать _TCHAR*
, А также INVALID_FILE_ATTRIBUES
определенно не строка…
if(GetFileAttributes(_T("C:\\Directory"))!= INVALID_FILE_ATTRIBUTES )
{...}
Увидеть Сводка по программированию Unicode.
Вы смешиваете текстовые литералы одного вида кодификации с вызовами функций с другим видом кодификации.
Все это замешательство связано с темной цепью #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]
Сравнение возможно, но оно никогда не будет правдой! Вы должны прочитать о функции и как ее использовать;)
Вы пытаетесь сравнить адрес указателей, а не компетентность!
Проверьте функцию: memcmp (…)