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

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


person dactz    schedule 30.03.2011    source источник


Ответы (5)


Вы компилируете свое приложение с набором символов, установленным в UNICODE (Настройки проекта -> Параметры конфигурации -> Общие). Файлы заголовков Windows используют #define для «сопоставления» имен функций либо с nameA (для многобайтовых строк), либо с nameW (для строк Unicode).

Это означает, что где-то в заголовочном файле будет такой #define

#define auxDIBImageLoad auxDIBImageLoadW

Таким образом, вы на самом деле не вызываете auxDIBImageLoad (нет функции с таким именем), вы вызываете auxDIBImageLoadW. И auxDIBImageLoadW ожидает строку юникода (wchar_t const*). Вы передаете многобайтовую строку (char const*).

Вы можете сделать одно из следующих

  • измените свой проект, чтобы использовать многобайтовый набор символов (-> настройки проекта)
  • явно вызвать многобайтовую версию функции, заменив auxDIBImageLoad на auxDIBImageLoadA
  • измените свою функцию LoadBMP, чтобы она принимала саму строку Unicode
  • преобразовать строку в unicode внутри LoadBMP

Я бы рекомендовал либо изменить LoadBMP, чтобы он принимал саму строку Unicode, либо вызвать auxDIBImageLoadA напрямую (в таком порядке). Изменение настроек проекта может быть приемлемым, если оно не нарушает работу большого количества другого кода. Однако я бы не предлагал преобразовывать строку, поскольку в этом нет необходимости. Вызов auxDIBImageLoadA напрямую намного проще, и результат тот же.

person Paul Groke    schedule 30.03.2011

У вас есть несколько вариантов:

  • Измените параметр «набор символов» в настройках вашего проекта с «Юникод» на «Не задан».
  • Звоните auxDIBImageLoadA вместо auxDIBImageLoad
  • Измените тип Filename с char* на wchar_t*
  • Используйте std::mbstowcs, чтобы преобразовать имя файла из char* в wchar_t*.
person ildjarn    schedule 30.03.2011

Похоже, вы пытаетесь использовать два разных набора символов. 'char ' — типичный ANSI, а LPCWSTR — широкий символ (т. е. Unicode). Если вы хотите использовать char, измените свойство «Набор символов» в настройках вашего проекта на «Нет набора».

person skimobear    schedule 30.03.2011

Попробуйте использовать 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);
 ...
}
person Slavy Mihov    schedule 23.10.2013

Преобразуйте массив символов в LPCWSTR. Вы можете увидеть это во втором посте ребят здесь

person Cole W    schedule 30.03.2011