web-dev-qa-db-fra.com

ne peut pas convertir le paramètre 1 de 'char *' en 'LPCWSTR'

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?

17
dactz

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

  • changez votre projet pour utiliser un jeu de caractères multi-octets (-> paramètres du projet)
  • appeler explicitement la version multi-octets de la fonction en remplaçant auxDIBImageLoad par auxDIBImageLoadA
  • changez votre fonction LoadBMP pour accepter une chaîne unicode
  • convertir la chaîne en unicode dans LoadBMP

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.

33
Paul Groke

Vous avez quelques options:

  • Modifiez l'option "Jeu de caractères" dans les paramètres de votre projet de "Unicode" à "Non défini".
  • Appelez auxDIBImageLoadA au lieu de auxDIBImageLoad
  • Remplacez le type de Filename de char* par wchar_t*
  • Utilisez std::mbstowcs pour convertir le nom de fichier d’un char* en un wchar_t*
10
ildjarn

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".

1
skimobear

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);
 ...
}
1
Slavy Mihov

Convertissez le tableau de caractères en LPCWSTR. Vous pouvez le voir dans le 2ème post des gars ici

0
Cole W