OPENFILENAMEダイアログからファイルパスを取得する関数を作成しようとしています。私のコードはこのように見えます。 OPENFILENAMEダイアログは、ファイルパスの代わりにアジアの文字を返します
wstring src;
bool open()
{
const string title = "Select a File";
wchar_t filename[MAX_PATH];
OPENFILENAMEA ofn;
ZeroMemory(&filename, sizeof(filename));
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = "Music (.mp3)\0*.mp3\0All\0*.*\0";
ofn.lpstrFile = LPSTR(filename);
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle = title.c_str();
ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
if (GetOpenFileNameA(&ofn))
{
src = filename; //<----------Save filepath in global variable
return true;
}
return false;
}
コメント行にブレークポイントを配置する際に、私はこの時点で私にあった「SRC」と同様に「ファイル名」、アジア起源の識別不能な文字の値を調べることができます。なぜこれが起こるのですか?これはコンバージョンの問題ですか?
EDIT:
迅速な回答に感謝し、いくつかのコメント、コードが完全に機能しています。非常に直接的なソリューションであるHans Passantにも感謝しています。また、関数を書き直し、間違いを説明し、処理方法を教えてくれたCody Greyにも非常に感謝しています。私はまだwinapiを学ぶための私の最初の措置をとっているので、この情報は将来のプログラムで私をうまく提供します。
wchar_tの代わりに 'char filename [MAX_PATH];'を試してください –
LPSTRキャストは非常に邪悪なので、間違っているとコンパイラは警告していません。あなたがそれを間違ってやってしまうのをやめさせてくれませ代わりにOPENFILENAMEWとGetOpenFileNameWを使用し、L "blabla"を使用してワイド文字列リテラルを生成します。 –
'GetOpenFileNameA'は 'GetOpenFileName'のANSIサブ機能ですので、コードがUnicodeとして構築されていないことを確認する必要があります。そして、あなたは 'GetOpenFileNameA'の代わりに 'GetOpenFileName'を使うべきです、良いサブ機能の選択は自動的に行われます。 – Gwen