-1

I was just modifying the code after reinstalling windows and VS 2012 Ultimate. The code (shown below) works perfectly fine before, but when I try to run the code right now, it gives following errors:

Error   1   error C2664: 'auxDIBImageLoadW' : cannot convert parameter 1 from 'LPSTR' to 'LPCWSTR'  

Code:

void CreateTexture(GLuint textureArray[], LPSTR strFileName, int textureID)
{
    AUX_RGBImageRec *pBitmap = NULL;
    if (!strFileName)                                   // Return from the function if no file name was passed in
        return;
    pBitmap = auxDIBImageLoad(strFileName);     //<-Error in this line      // Load the bitmap and store the data

    if (pBitmap == NULL)                                    // If we can't load the file, quit!
        exit(0);

    // Generate a texture with the associative texture ID stored in the array
    glGenTextures(1, &textureArray[textureID]);

    // This sets the alignment requirements for the start of each pixel row in memory.
    //  glPixelStorei (GL_UNPACK_ALIGNMENT, 1);

    // Bind the texture to the texture arrays index and init the texture
    glBindTexture(GL_TEXTURE_2D, textureArray[textureID]);

    // Build Mipmaps (builds different versions of the picture for distances - looks better)
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, pBitmap->sizeX, pBitmap->sizeY, GL_RGB, GL_UNSIGNED_BYTE, pBitmap->data);

    // Lastly, we need to tell OpenGL the quality of our texture map.  GL_LINEAR is the smoothest.
    // GL_NEAREST is faster than GL_LINEAR, but looks blochy and pixelated.  Good for slower computers though.
    // Read more about the MIN and MAG filters at the bottom of main.cpp

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    //  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    //  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);


    // Now we need to free the bitmap data that we loaded since openGL stored it as a texture

    if (pBitmap)                                        // If we loaded the bitmap
    {
        if (pBitmap->data)                              // If there is texture data
        {
            free(pBitmap->data);                        // Free the texture data, we don't need it anymore
        }

        free(pBitmap);                                  // Free the bitmap structure
    }
}

I tried this Link, This one too and also Tried this one too. but still getting error.

This function is used after initialization as:

LPCWSTR k =L"grass.bmp";
CreateTexture(g_Texture, "building1.bmp", 0);
CreateTexture(g_Texture, "clock.bmp", 0);
//list goes on

Can you help me out?

Community
  • 1
  • 1
Sikander Hayyat
  • 117
  • 1
  • 3
  • 12

2 Answers2

1

Change "LPSTR strFileName" to "LPCWSTR strFileName", "building1.bmp" to L"building1.bmp and "clock.bmp" to L"clock.bmp".

Always be careful because LPSTR is ASCII and LPCWSTR is Unicode. So if the function needs a Unicode variable (like this: L"String here") you can't give it a ASCII string.

LHLaurini
  • 1,737
  • 17
  • 31
1

The solutions are either:

Change your function prototype to take wide strings:

void CreateTexture(GLuint textureArray[], LPWSTR strFileName, int textureID)
//...
LPCWSTR k =L"grass.bmp";
CreateTexture(g_Texture, L"building1.bmp", 0);
CreateTexture(g_Texture, L"clock.bmp", 0);

or

Don't change your function prototype, but call the A version of the API function:

pBitmap = auxDIBImageLoadA(strFileName);  

Recommended: Stick to wide strings and use the correct string types.

PaulMcKenzie
  • 34,698
  • 4
  • 24
  • 45