c++ visual-c++ opengl char bmp

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 con auxDIBImageLoadA
  • 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 de auxDIBImageLoad
  • Cambie el tipo de Filename de Filename de char* a wchar_t*
  • Use std::mbstowcs para convertir el nombre de archivo de un char* a un wchar_t*