J'essaie de charger un fichier 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
}
cela vient d'un exemple mais je reçois maintenant l'erreur
erreur C2664: 'auxDIBImageLoadW': impossible de convertir le paramètre 1 de 'char *' en 'LPCWSTR'
comment pourrais-je corriger cela?
Vous compilez votre application avec le jeu de caractères défini sur UNICODE (Paramètres du projet -> Options de configuration -> Général). Les fichiers d’en-tête Windows utilisent #defines pour "mapper" les noms de fonction en nameA (pour les chaînes multi-octets) ou nameW (pour les chaînes en unicode).
Cela signifie que quelque part dans un fichier d'en-tête, il y aura un #define comme ceci
#define auxDIBImageLoad auxDIBImageLoadW
Donc, vous n'appelez pas réellement auxDIBImageLoad
(il n'y a pas de fonction portant ce nom), vous appelez auxDIBImageLoadW
. Et auxDIBImageLoadW
attend une chaîne unicode (wchar_t const*
). Vous passez une chaîne multi-octets (char const*
).
Vous pouvez faire l'une des choses suivantes
auxDIBImageLoad
par auxDIBImageLoadA
LoadBMP
pour accepter une chaîne unicodeLoadBMP
Je recommanderais de changer LoadBMP
pour accepter une chaîne unicode ou d'appeler directement auxDIBImageLoadA
(dans cet ordre) . Changer les paramètres du projet peut être OK s'il ne casse pas beaucoup d'autres codes ..__ not suggère de convertir la chaîne car elle est inutile. Appeler directement auxDIBImageLoadA
est beaucoup plus facile et le résultat est identique.
Vous avez quelques options:
auxDIBImageLoadA
au lieu de auxDIBImageLoad
Filename
de char*
par wchar_t*
std::mbstowcs
pour convertir le nom de fichier d’un char*
en un wchar_t*
On dirait que vous essayez d'utiliser deux jeux de caractères différents. 'char' est l'ANSI typique et LPCWSTR est le caractère large (unicode, par exemple). Si vous souhaitez utiliser char , modifiez la propriété "Jeu de caractères" dans les paramètres de votre projet sur "Aucun jeu".
Essayez d’utiliser MultiByteToWideChar () de la manière suivante:
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);
...
}
Convertissez le tableau de caractères en LPCWSTR. Vous pouvez le voir dans le 2ème post des gars ici