невозможно преобразовать параметр 1 из 'char *' в 'LPCWSTR' - PullRequest
17 голосов
/ 30 марта 2011

Я пытаюсь загрузить файл 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»

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

Ответы [ 5 ]

33 голосов
/ 30 марта 2011

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

Это означает, что где-то в заголовочном файле будет присутствовать символ #definethis

#define auxDIBImageLoad auxDIBImageLoadW

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

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

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

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

10 голосов
/ 30 марта 2011

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

  • Измените параметр «набор символов» в настройках проекта с «Юникод» на «Не установлен»
  • Звоните auxDIBImageLoadA вместо auxDIBImageLoad
  • Изменить тип Filename с char* на wchar_t*
  • Используйте std::mbstowcs для преобразования имени файла из char* в wchar_t*
1 голос
/ 23 октября 2013

Попробуйте использовать 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);
 ...
}
1 голос
/ 30 марта 2011

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

0 голосов
/ 30 марта 2011

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

...