指针和引用(将char转换为LPCWSTR)

时间:2014-03-30 20:52:42

标签: c++ glut

这里我正在解决在使用Glut-library时VS2013中发生的错误。正如我所见 - 这是指针和引用的一个简单问题。因此,第11行的输出是:

## error C2664: 'AUX_RGBImageRec *auxDIBImageLoadW(LPCWSTR)' : cannot convert argument 1 from 'char [13]' to 'LPCWSTR'

指向的类型是无关的;转换需要reinterpret_cast,C风格的转换或函数式转换

错误在哪里?它必须是第11行中错过的(*)符号。

void TextureInit()
{
 char strFile[]="Particle.bmp";
 AUX_RGBImageRec *pImage;
 /* Выравнивание в *.bmp по байту */
 glPixelStorei(GL_UNPACK_ALIGNMENT,1);
 /* Создание идентификатора для текстуры */
 glGenTextures(1,&TexId[0]);
 /* Загрузка изображения в память */

 pImage = auxDIBImageLoad(strFile);

 /* Начало описания свойств текстуры */
 glBindTexture(GL_TEXTURE_2D,TexId[0]);
 /* Создание уровней детализации и инициализация текстуры
  */
 gluBuild2DMipmaps(GL_TEXTURE_2D,GL_RGB,pImage->sizeX,
                   pImage->sizeY,GL_RGB,GL_UNSIGNED_BYTE,
                   pImage->data);

 /* Задание параметров текстуры */
 /* Повтор изображения по параметрическим осям s и t */
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
 /* Не использовать интерполяцию при выборе точки на
 * текстуре
  */
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 /* Совмещать текстуру и материал объекта */
 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
}

4 个答案:

答案 0 :(得分:1)

这不是指针/引用问题,而是字符串编码问题。 auxDIBImageLoadW需要LPCWSTR - UTF-16字符串。您正尝试将ASCII字符串传递给它。

要解决此问题,请将strFile声明为wchar_t strFile[] = L"Particle.bmp";

答案 1 :(得分:0)

在Unicode版本中(自VS2005以来一直是默认版本),auxDIBImageLoad()扩展为auxDIBImageLoadW()(结尾W代表宽字符,即wchar_t s),这是API的Unicode UTF-16版本。

您传递给strFile的{​​{1}}参数是auxDIBImageLoadW() - 字符串(不是char字符串),定义为:

wchar_t

所以你在字符串参数中不匹配。

一个选项是将char strFile[]="Particle.bmp"; 定义为strFile字符串(另请注意wchar_t前缀以定义字符串文字):

L

或者,如果由于某种原因您必须拥有wchar_t strFile[] = L"Particle.bmp"; 字符串,则可以使用ATL helper macro CA2W(来自char ansi - ie {{ 1}} - string - to A ide Unicode UTF-16 char string):

W

wchar_t是围绕#include <atlconv.h> // for CA2W // char strFile[]... pImage = auxDIBImageLoad(CA2W(strFile)); Win32 API的方便的RAII包装器。)

答案 2 :(得分:0)

我假设你没有打算来使用Unicode库。在这种情况下,请删除项目属性中_UNICODE和UNICODE的宏定义,然后使用_MBCS。但是,这更有可能在使用不同语言环境的Windows计算机上出现错误。

一般来说,不应该直接使用char或wchar_t与Windows API进行交互。为了获得最大的兼容性,您应该将它们包装在_T宏中。而不是写

char strFile[]="Particle.bmp";

TCHAR strFile[]=_T("Particle.bmp");

有关详细信息,请参阅Microsoft文档。

答案 3 :(得分:0)

没有一种方法可以解决。但有趣的是,我来到另一个部分,我已经转移到另一个主题: [https://stackoverflow.com/questions/23064256/opening-a-bmp-with-auxdibimageload-within-glut-library][1]