【问题标题】:cannot convert parameter 1 from 'char *' to 'LPCWSTR'无法将参数 1 从“char *”转换为“LPCWSTR”
【发布时间】:2011-07-25 17:36:47
【问题描述】:

我正在尝试加载 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”

我该如何纠正这个问题?

【问题讨论】:

    标签: c++ visual-c++ opengl char bmp


    【解决方案1】:

    您正在编译您的应用程序,并将字符集设置为 UNICODE(项目设置 -> 配置选项 -> 常规)。 Windows 头文件使用 #defines 将函数名称“映射”到 nameA(对于多字节字符串)或 nameW(对于 unicode 字符串)。

    这意味着在头文件的某处会有这样的#define

    #define auxDIBImageLoad auxDIBImageLoadW
    

    所以你实际上并没有调用auxDIBImageLoad(没有具有该名称的函数),你调用的是auxDIBImageLoadWauxDIBImageLoadW 需要一个 unicode 字符串 (wchar_t const*)。您正在传递一个多字节字符串 (char const*)。

    您可以执行以下操作之一

    • 将您的项目更改为使用多字节字符集(-> 项目设置)
    • 通过将auxDIBImageLoad替换为auxDIBImageLoadA来显式调用函数的多字节版本
    • 更改您的 LoadBMP 函数以接受 unicode 字符串本身
    • LoadBMP内将字符串转换为unicode

    我建议更改 LoadBMP 以接受 unicode 字符串本身或直接调用 auxDIBImageLoadA(按此顺序)。 如果不破坏很多其他代码,更改项目设置可能没问题。 我会 not 建议转换字符串,因为它是不必要的。直接调用auxDIBImageLoadA就简单多了,结果也是一样的。

    【讨论】:

      【解决方案2】:

      你有几个选择:

      • 将项目设置中的“字符集”选项从“Unicode”更改为“未设置”
      • 请致电auxDIBImageLoadA 而不是auxDIBImageLoad
      • Filename 的类型从char* 更改为wchar_t*
      • 使用std::mbstowcs 将文件名从char* 转换为wchar_t*

      【讨论】:

        【解决方案3】:

        看起来您尝试使用两个不同的字符集。 'char ' 是典型的 ANSI,LPCWSTR 是宽字符(即 unicode)。如果您想使用 char,请将项目设置中的“Character Set”属性更改为“No Set”。

        【讨论】:

          【解决方案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。你可以在第二个帖子here中看到这一点

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-07-06
              • 1970-01-01
              • 2011-07-25
              • 1970-01-01
              • 1970-01-01
              • 2018-06-08
              • 1970-01-01
              • 2020-04-04
              相关资源
              最近更新 更多