it-swarm.com.de

parameter 1 kann nicht von 'char *' in 'LPCWSTR' konvertiert werden

Ich versuche, eine BMP -Datei zu laden

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
}

dies ist von einem Beispiel gekommen, aber jetzt bekomme ich den Fehler

fehler C2664: 'auxDIBImageLoadW': Parameter 1 kann nicht von 'char *' in 'LPCWSTR' konvertiert werden.

wie kann ich das korrigieren?

17
dactz

Sie kompilieren Ihre Anwendung mit Zeichensatz auf UNICODE (Projekteinstellungen -> Konfigurationsoptionen -> Allgemein). Windows-Header-Dateien verwenden #defines, um Funktionsnamen entweder nameA (für Multibyte-Zeichenfolgen) oder nameW (für Unicode-Zeichenfolgen) zuzuordnen.

Das heißt, irgendwo in einer Header-Datei wird ein #define wie folgt angezeigt

#define auxDIBImageLoad auxDIBImageLoadW

Sie rufen also nicht wirklich auxDIBImageLoad auf (es gibt keine Funktion mit diesem Namen), Sie rufen auxDIBImageLoadW auf. Und auxDIBImageLoadW erwartet eine Unicode-Zeichenfolge (wchar_t const*). Sie übergeben einen Multibyte-String (char const*).

Sie können einen der folgenden Schritte ausführen

  • Ändern Sie Ihr Projekt, um den Multi-Byte-Zeichensatz zu verwenden (-> Projekteinstellungen)
  • rufen Sie die Multi-Byte-Version der Funktion explizit auf, indem Sie auxDIBImageLoad durch auxDIBImageLoadA ersetzen.
  • Ändern Sie Ihre LoadBMP-Funktion, um einen Unicode-String selbst zu akzeptieren
  • konvertieren Sie den String innerhalb von LoadBMP in Unicode.

Ich würde empfehlen, entweder LoadBMP zu ändern, um einen Unicode-String selbst zu akzeptieren, oder auxDIBImageLoadA direkt (in dieser Reihenfolge) aufzurufen . Das Ändern der Projekteinstellungen ist möglicherweise in Ordnung, wenn nicht viel anderer Code gebrochen wird nicht schlägt jedoch vor, die Zeichenfolge zu konvertieren, da dies nicht erforderlich ist. Der direkte Aufruf von auxDIBImageLoadA ist viel einfacher und das Ergebnis ist das gleiche.

33
Paul Groke

Sie haben einige Möglichkeiten:

  • Ändern Sie die Option "Zeichensatz" in Ihren Projekteinstellungen von "Unicode" in "Nicht festgelegt".
  • Aufruf von auxDIBImageLoadA anstelle von auxDIBImageLoad
  • Filenames Typ von char* in wchar_t* ändern
  • Verwenden Sie std::mbstowcs , um den Dateinamen von einem char* in einen wchar_t* zu konvertieren.
10
ildjarn

Sieht aus, als würden Sie versuchen, zwei verschiedene Zeichensätze zu verwenden. 'char' ist das typische ANSI und LPCWSTR das Breitzeichen (d. h. Unicode). Wenn Sie char verwenden möchten, ändern Sie die Eigenschaft 'Character Set' in Ihrer Projekteinstellung in 'No Set'.

1
skimobear

Versuchen Sie es mit MultiByteToWideChar () auf folgende Weise:

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

Konvertieren Sie das Zeichenarray in ein LPCWSTR. Sie können dies im 2. Jungs Beitrag sehen hier

0
Cole W