【问题标题】:Pointers and references (convert char to LPCWSTR)指针和引用(将 char 转换为 LPCWSTR)
【发布时间】:2014-04-14 23:42:25
【问题描述】:

在这里,我正在解决在 VS2013 中使用 Glut 库时发生的错误。正如我所看到的 - 这是指针和引用的简单问题。所以,第 11 行的输出是:

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

指向的类型是不相关的;转换需要 reinterpret_cast、C-style cast 或 function-style cast

错在哪里?它必须是第 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);
}

【问题讨论】:

  • 阅读std::mbstowcs。或者使用宽字符开头。
  • 项目属性/常规 - 将您的字符集更改为 MBCS。它默认为 Unicode,这就是导致您的问题的原因。

标签: c++ glut


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我假设您不打算使用 Unicode 库。在这种情况下,删除项目属性中_UNICODE 和UNICODE 的宏定义,并改用_MBCS。然而,这使得字符在使用不同语言环境的 Windows 机器上更有可能出错。

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

    char strFile[]="Particle.bmp";
    

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

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

    【讨论】:

      【解决方案3】:

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

      您传递给auxDIBImageLoadW()strFile 参数是char 字符串(不是wchar_t 字符串),定义为:

      char strFile[]="Particle.bmp";
      

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

      一个选项是将strFile 定义为wchar_t 字符串(还要注意L 前缀来定义字符串文字):

      wchar_t strFile[] = L"Particle.bmp";
      

      或者,如果由于某种原因您必须有一个char 字符串,您可以在调用站点使用ATL helper macro CA2W 将其转换(从Aansi - 即char-string - 转换为@ 987654339@ide Unicode UTF-16 wchar_t 字符串):

      #include <atlconv.h> // for CA2W
      
      // char strFile[]...
      pImage = auxDIBImageLoad(CA2W(strFile));
      

      CA2W 是围绕::MultiByteToWideChar() Win32 API 的便捷 RAII 包装器。)

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-12
          • 1970-01-01
          • 2013-07-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多