c++ - no se puede convertir el parámetro 1 de ''char*'' a ''LPCWSTR''
visual-c++ opengl (5)
Convertir la matriz de caracteres a un LPCWSTR. Puedes ver esto en la segunda publicación de chicos here
Estoy tratando de cargar un archivo 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
}
esto viene de un ejemplo, sin embargo ahora estoy recibiendo el error
error C2664: ''auxDIBImageLoadW'': no se puede convertir el parámetro 1 de ''char *'' a ''LPCWSTR''
¿Cómo podría corregir esto?
Está compilando su aplicación con el conjunto de caracteres establecido en UNICODE (Configuración del proyecto -> Opciones de configuración -> General). Los archivos de encabezado de Windows usan # define para "asignar" nombres de funciones a nombresA (para cadenas de varios bytes) o nombreW (para cadenas de Unicode).
Eso significa que en algún lugar de un archivo de encabezado habrá una #define como esta
#define auxDIBImageLoad auxDIBImageLoadW
Entonces, en realidad no estás llamando a auxDIBImageLoad
(no hay una función con ese nombre), estás llamando a auxDIBImageLoadW
. Y auxDIBImageLoadW
espera una cadena Unicode ( wchar_t const*
). Estás pasando una cadena de múltiples bytes ( char const*
).
Puedes hacer uno de los siguientes
- cambie su proyecto para usar el conjunto de caracteres de múltiples bytes (-> configuración del proyecto)
- llame explícitamente a la versión de múltiples bytes de la función reemplazando
auxDIBImageLoad
conauxDIBImageLoadA
- cambia tu función
LoadBMP
para aceptar una cadena Unicode - convertir la cadena a Unicode dentro de
LoadBMP
Recomiendo cambiar LoadBMP
para aceptar una cadena Unicode o llamar a auxDIBImageLoadA
directamente (en ese orden). Cambiar la configuración del proyecto podría estar bien si no rompe muchos otros códigos. Sin embargo, no sugeriría convertir la cadena, ya que es innecesario. Llamar a auxDIBImageLoadA
directamente es mucho más fácil, y el resultado es el mismo.
Intente usar MultiByteToWideChar () de la siguiente manera:
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);
...
}
Parece que estás tratando de usar dos juegos de caracteres diferentes. ''char '' es el típico ANSI y LPCWSTR es el carácter ancho (es decir, Unicode). Si desea usar el cambio de caracteres, la propiedad "Conjunto de caracteres" en la configuración de su proyecto a "Sin conjunto".
Tienes pocas opciones:
- Cambie la opción ''conjunto de caracteres'' en la configuración de su proyecto de ''Unicode'' a ''No establecido''
- Llame a
auxDIBImageLoadA
lugar deauxDIBImageLoad
- Cambie el tipo de
Filename
deFilename
dechar*
awchar_t*
- Use
std::mbstowcs
para convertir el nombre de archivo de unchar*
a unwchar_t*