17

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

我怎么能纠正这个?

4

5 回答 5

33

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

这意味着在头文件的某个地方会有一个像这样的#define

#define auxDIBImageLoad auxDIBImageLoadW

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

您可以执行以下操作之一

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

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

于 2011-03-30T00:55:21.197 回答
10

你有几个选择:

  • 将项目设置中的“字符集”选项从“Unicode”更改为“未设置”
  • 调用auxDIBImageLoadA而不是auxDIBImageLoad
  • Filename将的类型从更改char*wchar_t*
  • 用于std::mbstowcs将文件名从 a 转换char*为 awchar_t*
于 2011-03-30T00:45:36.410 回答
1

Try using MultiByteToWideChar() the following way:

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);
 ...
}
于 2013-10-23T02:57:34.923 回答
1

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

于 2011-03-30T00:46:07.173 回答
0

将字符数组转换为 LPCWSTR。您可以在此处的第二个帖子中看到这一点

于 2011-03-30T00:49:12.017 回答