cannot convert parameter 1 from 'char *' to 'LPCWSTR'
Asked Answered
L

5

17

Im trying to load a BMP file

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
}

this has come from an example however i'm now getting the error

error C2664: 'auxDIBImageLoadW' : cannot convert parameter 1 from 'char *' to 'LPCWSTR'

how could I correct this?

Lilylilyan answered 30/3, 2011 at 0:32 Comment(0)
G
33

You're compiling your application with Character-Set set to UNICODE (Project Settings -> Configuration Options -> General). Windows header files use #defines to "map" function names to either nameA (for multi-byte strings) or nameW (for unicode strings).

That means somewhere in a header file there will be a #define like this

#define auxDIBImageLoad auxDIBImageLoadW

So you're not actually calling auxDIBImageLoad (there is no function with that name), you're calling auxDIBImageLoadW. And auxDIBImageLoadW expects a unicode string (wchar_t const*). You're passing a multi-byte string (char const*).

You can do one of the following

  • change your project to use multi-byte character set (-> project settings)
  • explicitly call the multi-byte version of the function by replacing auxDIBImageLoad with auxDIBImageLoadA
  • change your LoadBMP function to accept a unicode string itself
  • convert the string to unicode inside LoadBMP

I'd recommend either changing LoadBMP to accept a unicode string itself or calling auxDIBImageLoadA directly (in that order). Changing the project settings might be OK if it doesn't break a lot of other code. I would not suggest converting the string though, since it's unnecessary. Calling auxDIBImageLoadA directly is far easier, and the result is the same.

Gressorial answered 30/3, 2011 at 0:55 Comment(0)
Q
10

You have a few options:

  • Change the 'character set' option in your project settings from 'Unicode' to 'Not Set'
  • Call auxDIBImageLoadA instead of auxDIBImageLoad
  • Change Filename's type from char* to wchar_t*
  • Use std::mbstowcs to convert Filename from a char* to a wchar_t*
Quinte answered 30/3, 2011 at 0:45 Comment(0)
M
1

Looks like your trying to use two different character sets. 'char ' is the typical ANSI and LPCWSTR is the wide character (i.e. unicode). If you would like to use char change the 'Character Set' property in your project setting to 'No Set'.

Mcginty answered 30/3, 2011 at 0:46 Comment(0)
D
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);
 ...
}
Dudden answered 23/10, 2013 at 2:57 Comment(0)
H
0

Convert the character array to a LPCWSTR. You can see this in the 2nd guys post here

Humidity answered 30/3, 2011 at 0:49 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.