17

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
}

これは例からのものですが、現在エラーが発生しています

エラー C2664: 'auxDIBImageLoadW': パラメーター 1 を 'char *' から 'LPCWSTR' に変換できません

どうすればこれを修正できますか?

4

5 に答える 5

33

Character-Set を UNICODE に設定してアプリケーションをコンパイルしています (プロジェクト設定 -> 構成オプション -> 一般)。Windows ヘッダー ファイルは #defines を使用して、関数名を nameA (マルチバイト文字列の場合) または nameW (Unicode 文字列の場合) に「マップ」します。

つまり、ヘッダー ファイルのどこかに、このような #define があることを意味します

#define auxDIBImageLoad auxDIBImageLoadW

したがって、実際に呼び出しているauxDIBImageLoadのではなく (その名前の関数はありません)、呼び出していますauxDIBImageLoadW。またauxDIBImageLoadW、Unicode 文字列 ( wchar_t const*) が必要です。マルチバイト文字列 ( char const*) を渡しています。

次のいずれかを実行できます。

  • マルチバイト文字セットを使用するようにプロジェクトを変更します (-> プロジェクト設定)。
  • auxDIBImageLoadに置き換えて、関数のマルチバイト バージョンを明示的に呼び出します。auxDIBImageLoadA
  • 関数を変更してLoadBMP、ユニコード文字列自体を受け入れるようにします
  • 内部で文字列をユニコードに変換しますLoadBMP

LoadBMPUnicode 文字列自体を受け入れるように変更するか、auxDIBImageLoadA直接 (この順序で)呼び出すことをお勧めします。プロジェクトの設定を変更しても、他の多くのコードが壊れない場合は問題ありません。ただし、不要なので、文字列を変換することはお勧めしません。auxDIBImageLoadA直接呼び出す方がはるかに簡単で、結果は同じです。

于 2011-03-30T00:55:21.197 に答える
10

いくつかのオプションがあります:

  • プロジェクト設定の「文字セット」オプションを「Unicode」から「未設定」に変更します
  • auxDIBImageLoadA代わりに呼び出すauxDIBImageLoad
  • Filenameのタイプを からchar*に変更しますwchar_t*
  • std::mbstowcsファイル名を から に変換するために使用char*しますwchar_t*
于 2011-03-30T00:45:36.410 に答える
1

次の方法でMultiByteToWideChar()を使用してみてください。

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);
 ...
}
于 2013-10-23T02:57:34.923 に答える
1

2 つの異なる文字セットを使用しようとしているようです。'char ' は典型的な ANSI で、LPCWSTR はワイド文字 (つまり unicode) です。char を使用する場合は、プロジェクト設定の「文字セット」プロパティを「設定なし」に変更します。

于 2011-03-30T00:46:07.173 に答える
0

文字配列を LPCWSTR に変換します。これは、ここの 2 番目のみんなの投稿で見ることができます。

于 2011-03-30T00:49:12.017 に答える