web-dev-qa-db-ja.com

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

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」に変換できません

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

17
dactz

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

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

#define auxDIBImageLoad auxDIBImageLoadW

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

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

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

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

33
Paul Groke

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

  • プロジェクト設定の「文字セット」オプションを「Unicode」から「未設定」に変更します
  • auxDIBImageLoadAの代わりにauxDIBImageLoadを呼び出します
  • Filenameのタイプをchar*からwchar_t*に変更します
  • std::mbstowcs を使用して、ファイル名をchar*からwchar_t*に変換します
10
ildjarn

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

1
skimobear

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

文字配列をLPCWSTRに変換します。これは2人目の投稿 here で確認できます。

0
Cole W