我正在尝试加载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'
我怎么能纠正这个?
答案 0 :(得分:33)
您正在使用字符集设置为UNICODE(项目设置 - >配置选项 - >常规)编译您的应用程序。 Windows头文件使用#defines将函数名称“映射”到nameA(对于多字节字符串)或nameW(对于unicode字符串)。
这意味着头文件中的某个地方会有#define这样的
#define auxDIBImageLoad auxDIBImageLoadW
所以你实际上并没有调用auxDIBImageLoad
(没有该名称的函数),你正在调用auxDIBImageLoadW
。并且auxDIBImageLoadW
需要一个unicode字符串(wchar_t const*
)。您正在传递一个多字节字符串(char const*
)。
您可以执行以下某项操作
auxDIBImageLoad
替换为auxDIBImageLoadA
LoadBMP
函数更改为接受unicode字符串本身LoadBMP
我建议更改LoadBMP
以接受unicode字符串本身或直接调用auxDIBImageLoadA
(按此顺序)。
如果不破坏许多其他代码,更改项目设置可能没问题。
我会不建议转换字符串,因为它是不必要的。直接调用auxDIBImageLoadA
要容易得多,结果也一样。
答案 1 :(得分:10)
您有几个选择:
auxDIBImageLoadA
而非auxDIBImageLoad
Filename
的类型从char*
更改为wchar_t*
std::mbstowcs
将文件名从char*
转换为wchar_t*
答案 2 :(得分:1)
看起来你试图使用两个不同的字符集。 'char '是典型的ANSI,LPCWSTR是宽字符(即unicode)。如果您想使用char ,请将项目设置中的“字符集”属性更改为“无设置”。
答案 3 :(得分:1)
尝试以下方式使用 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);
...
}
答案 4 :(得分:0)
将字符数组转换为LPCWSTR。您可以在第2个帖子here
中看到这个