GetOpenFileNameでの日本語文字列取得

解決


DD.  2006-02-03 02:01:15  No: 60635

GetOpenFileName()に関してなのですが、
これで"日本語の混じった"ファイル名の指定や、フォルダパスに"日本語が混じって"いるとエラーにはならないのですが、うまく文字列が格納されません。

OPENFILENAME に指定しているメンバは以下の通りです。

  OPENFILENAME ofn = { 0 };

  ofn.lStructSize = sizeof( OPENFILENAME );
  ofn.hwndOwner = GetActiveWindow();
  ofn.lpstrFilter = "BMP Files(*.bmp)\0*.bmp\0All Files(*.*)\0*.*\0\0";
  ofn.lpstrFile = files;
  ofn.nMaxFile = MAX_PATH;
  ofn.Flags = OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT |OFN_EXPLORER;
  ofn.lpstrTitle = "追加する画像ファイルを選択して下さい";
  ofn.nMaxFileTitle = MAX_PATH;

日本語が混じっていなければ特に問題はありませんでした。

日本語を許可するような設定があるのでしょうか?
Flagsメンバで確認してみましたがそれっぽいものが見つかりませんでした。


Toshi  2006-02-03 02:17:37  No: 60636

GetOpenFileName()呼出し後の処理と、どんなファイル名を選んだ時にダメなのかも書いた方がいいです。ついでにプラットフォームやVCのバージョンも。


DD.  2006-02-03 04:55:41  No: 60637

>ついでにプラットフォームやVCのバージョンも。
もぅしわけないっす。。。

OS:XP VC++2005使用

>GetOpenFileName()呼出し後の処理と、どんなファイル名を選んだ時にダメなのかも書いた方がいいです。

  OPENFILENAME ofn = { 0 };

  ofn.lStructSize = sizeof( OPENFILENAME );
  ofn.hwndOwner = GetActiveWindow();
  ofn.lpstrFilter = "All Files(*.*)\0*.*\0\0";
  ofn.lpstrFile = file_name;
  ofn.nMaxFile = MAX_PATH;
  ofn.Flags = OFN_PATHMUSTEXIST | ...;
  ofn.lpstrTitle = "...";
  ofn.nMaxFileTitle = MAX_PATH;

  GetOpenFileName( &ofn );
  std::ifstream read_file( read_file_name, std::ios::in );

こいつの read_file() でエラーになります。

デスクトップにあるファイル(日本語が含まれるパス)や日本語の含まれたファイル(ひらがな・カタカナ・漢字問わず)を read_file() に渡すとエラーとなります。拡張子等は関係なさそうです。

そして私の勘違いで GetOpenFileName() が問題ではなさそうです。。。
デバッガで GetOpenFileName() で取得したファイル名を確認したところマルチバイト文字の場合のみ、その 1byte目と 2byte目が別々で表示されていたためにおかしな文字列になっていると勘違いしていたようです。

取得した文字列を出力すると問題なかったです。

でも、read_file()で日本語文字はダメなんですかね・・・?


kure  2006-02-03 05:16:23  No: 60638

>ofn.lpstrFile = file_name;
(省略)
>std::ifstream read_file( read_file_name, std::ios::in );

ってなってますが、read_file_nameはただのタイプミス?
read_file_nameがfile_nameの参照だったりしないのであれば
ofn.lpstrFile = read_file_name
にするかfile_nameからread_file_nameに文字列コピーする必要があります。


DD.  2006-02-03 09:01:04  No: 60639

>ってなってますが、read_file_nameはただのタイプミス?
r
ごめんなさい。typoです。。。
ただの間違いで、実際にはあってます。

read_file()に渡している文字列を出力して確認してますので。


tetrapod  2006-02-03 19:03:44  No: 60640

GetOpenFileName が犯人でないことが判明なら一旦 Close して新スレ。

MFC は #define new DEBUG_NEW とか恐ろしいことをしてるので
STL な関数は MFC AppWizard に自動生成させたファイル以外に置くほうが無難。
とりあえず俺のデスクトップのファイルは ifstream で読めることを確認済み。


kure  2006-02-03 19:19:21  No: 60641

VS2005のC++だとデフォルトでUnicodeビルドされますが、
マルチバイト指定してコンパイルしてます?
TCHAR(または_TCHAR)はwchar_tでifstreamに渡すのはcharでこけてるとか。


DD.  2006-02-03 20:08:26  No: 60642

>MFC は #define new DEBUG_NEW とか恐ろしいことをしてるので
>STL な関数は MFC AppWizard に自動生成させたファイル以外に置くほうが無難。
MFCは使用ないです。。。

>とりあえず俺のデスクトップのファイルは ifstream で読めることを確認済み。
console で read_file() するだけならば問題なかったです。
なんでなんだorz

GetOpenFileName() の後で特に処理かけてたりはしないんですが。

>VS2005のC++だとデフォルトでUnicodeビルドされますが、
>マルチバイト指定してコンパイルしてます?
問題ないっす。

きちっとマルチバイトになってること確認しました。

>GetOpenFileName が犯人でないことが判明なら一旦 Close して新スレ。
tetrapodさんのおっしゃられるとおり、議題が変わってしまうので一旦〆とさせていただきます。

ありがとうございました。<(_ _)>


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加