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」に変換できません
どうすれば修正できますか?
文字セットをUNICODEに設定してアプリケーションをコンパイルしています(プロジェクト設定->構成オプション->一般)。 Windowsヘッダーファイルは、#definesを使用して関数名をnameA(マルチバイト文字列の場合)またはnameW(Unicode文字列の場合)に「マップ」します。
これは、ヘッダーファイルのどこかに、次のような#defineがあることを意味します
#define auxDIBImageLoad auxDIBImageLoadW
したがって、実際にauxDIBImageLoad
を呼び出すのではなく(その名前の関数はありません)、auxDIBImageLoadW
を呼び出します。そしてauxDIBImageLoadW
はユニコード文字列(wchar_t const*
)。マルチバイト文字列(char const*
)。
次のいずれかを実行できます
auxDIBImageLoad
をauxDIBImageLoadA
に置き換えて、関数のマルチバイトバージョンを明示的に呼び出すLoadBMP
関数を変更して、Unicode文字列自体を受け入れるLoadBMP
内のユニコードに変換しますLoadBMP
を変更してUnicode文字列自体を受け入れるか、auxDIBImageLoadA
を直接(この順序で)呼び出すことをお勧めします。他の多くのコードを壊さないのであれば、プロジェクト設定の変更は問題ないかもしれません。 notでも文字列を変換することをお勧めします。これは不要だからです。 auxDIBImageLoadA
を直接呼び出すのははるかに簡単で、結果は同じです。
いくつかのオプションがあります。
auxDIBImageLoadA
の代わりにauxDIBImageLoad
を呼び出しますFilename
のタイプをchar*
からwchar_t*
に変更しますstd::mbstowcs
を使用して、ファイル名をchar*
からwchar_t*
に変換します2つの異なる文字セットを使用しようとしているようです。 'char 'は一般的なANSIで、LPCWSTRはワイド文字(つまり、ユニコード)です。charを使用する場合プロジェクト設定の[文字セット]プロパティを[設定なし]に変更します。
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);
...
}
文字配列をLPCWSTRに変換します。これは2人目の投稿 here で確認できます。