Не может преобразовать параметр 1 из 'char *' в 'LPCWSTR'
Я пытаюсь загрузить файл BMP
AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image
{
FILE *File=NULL; // File Handle
if (!Filename) // Make Sure A Filename Was Given
{
return NULL; // If Not Return NULL
}
File=fopen(Filename,"r"); // Check To See If The File Exists
if (File) // Does The File Exist?
{
fclose(File); // Close The Handle
return auxDIBImageLoad(Filename); // Load The Bitmap And Return A Pointer
}
return NULL; // If Load Failed Return NULL
}
это произошло из примера, но теперь я получаю сообщение об ошибке
ошибка C2664: 'auxDIBImageLoadW': не может преобразовать параметр 1 из 'char *' в 'LPCWSTR'
Как я могу исправить это?
Ответы
Ответ 1
Вы компилируете свое приложение с набором символов, установленным в UNICODE (Настройки проекта → Параметры конфигурации → Общие). Заголовочные файлы Windows используют #defines для имен функций "map" для имени nameA (для многобайтовых строк) или nameW (для строк Unicode).
Это означает, что где-то в файле заголовка будет #define, как этот
#define auxDIBImageLoad auxDIBImageLoadW
Итак, вы на самом деле не называете auxDIBImageLoad
(нет функции с этим именем), вы вызываете auxDIBImageLoadW
. И auxDIBImageLoadW
ожидает строку юникода (wchar_t const*
). Вы передаете многобайтную строку (char const*
).
Вы можете сделать одно из следующих
- измените свой проект на использование многобайтового набора символов (- > настройки проекта)
- явно вызывать многобайтную версию функции, заменив
auxDIBImageLoad
на auxDIBImageLoadA
- измените вашу функцию
LoadBMP
, чтобы принять строку самого юникода
- преобразовать строку в unicode внутри
LoadBMP
Я бы рекомендовал либо изменить LoadBMP
, чтобы принять строку unicode, либо напрямую вызвать auxDIBImageLoadA
(в этом порядке).
Изменение параметров проекта может быть ОК, если оно не сломает много другого кода.
Однако я бы не предложил преобразовать строку, поскольку это не нужно. Вызов auxDIBImageLoadA
напрямую намного проще, и результат тот же.
Ответ 2
У вас есть несколько вариантов:
- Измените параметр "набор символов" в настройках вашего проекта с "Юникод" на "Не задано"
- Вызовите
auxDIBImageLoadA
вместо auxDIBImageLoad
- Измените
Filename
с char*
на wchar_t*
- Используйте
std::mbstowcs
для преобразования имени файла из char*
в wchar_t*
Ответ 3
Похоже, вы пытаетесь использовать два разных набора символов. "char" - это типичный ANSI и LPCWSTR - это широкий символ (то есть unicode). Если вы хотите использовать char, измените свойство "Набор символов" в настройках вашего проекта на "Нет набора".
Ответ 4
Попробуйте использовать MultiByteToWideChar() следующим образом:
void main(int argc, char* argv[])
{
...
wchar_t filename[4096] = {0};
MultiByteToWideChar(0, 0, argv[1], strlen(argv[1]), filename, strlen(argv[1]));
// RenderFile() requires LPCWSTR (or wchar_t*, respectively)
hr = pGraph->RenderFile(filename, NULL);
...
}
Ответ 5
Преобразуйте массив символов в LPCWSTR. Вы можете увидеть это во 2-м ребята post здесь