Подтвердить что ты не робот

Не может преобразовать параметр 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'

Как я могу исправить это?

4b9b3361

Ответ 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 здесь