none
Win32API ファイル読み込みについて(2) RRS feed

  • 質問

  • 数か月前にも一度ファイル読み込みの質問をさせていただきましたが,今回もパスの指定について質問させていただきます.

    現在,Visual Studio2005,Win32APIでアプリケーションの開発を行っています.

    このアプリケーションの一つの機能としてファイルを読み込み.指定の場所へ保存する機能を実装しています.

    ファイルの読み込みにはGetOpenFileNameを用いています.

    また,この関数の引数にはOPENFILENAMEを指定します.

    ソースの一部を以下に示します.

    --------------------------------------

    OPENFILENAME ofn; //構造体の宣言

      ofn.lStructSize = sizeof (OPENFILENAME); //値の代入

    ofn.hwndOwner = hWnd;

    ofn.lpstrFilter = TEXT("All files {*.*}\0*.*\0\0");

    //ofn.lpstrCustomFilter = strCustom;

    ofn.nMaxCustFilter = 256;

    ofn.nFilterIndex = 0;

    ofn.lpstrFile = path;

    ofn.lpstrInitialDir=L"D:"; //ここにパスを指定

    ofn.nMaxFile = MAX_PATH;

    ofn.Flags = OFN_FILEMUSTEXIST;

    ofn.lpstrTitle = L"File Open";//ダイアログボックスのタイトル

    ・・・・・・

    GetOpenFileName(&ofn);

    前回の質問により,lpstrInitialDirに絶対パスを指定することにより,

    最初に開くディレクトリを任意の場所に指定することができました.(中澤@失業者さん,どちさんさん,ありがとうございました.)

    前置きが長くなりましたが,今回の質問です.最初に開くディレクトリを絶対パスで指定した場所ではなく.現在の実行ファイルがある場所(Vs2005のソリューションファイルなどがある場所です.)に指定するためにはどのように記述すればよいのでしょうか?

    http://hp.vector.co.jp/authors/VA023539/tips/dialog/004.htm を参考に,lpstrInitialDir = NULLを指定しても,

    最後に開いたディレクトリが毎回開かれます.

    わかる方,回答をお願いします.


    2011年6月3日 9:18

回答

  • こってり太郎さんこんばんは、おのでらです。

    Windows 標準のファイル選択ダイアログを開いた場合、カレントディレクトリが最後にファイルを選択したフォルダパスになってしまうため、lpstrInitialDir を NULL にしてもカレントディレクトリが設定されてしまうために起こる現象だと思います。ですので特定のフォルダを最初に開きたい場合は明示的に実行ファイルのパスを指定する必要があります。

    ※ほかにはカレントディレクトリ自体を実行ファイルのあるパスにしてしまうという手もあります。


    おのでら (http://sorceryforce.com/)
    2011年6月3日 9:33

すべての返信

  • こってり太郎さんこんばんは、おのでらです。

    Windows 標準のファイル選択ダイアログを開いた場合、カレントディレクトリが最後にファイルを選択したフォルダパスになってしまうため、lpstrInitialDir を NULL にしてもカレントディレクトリが設定されてしまうために起こる現象だと思います。ですので特定のフォルダを最初に開きたい場合は明示的に実行ファイルのパスを指定する必要があります。

    ※ほかにはカレントディレクトリ自体を実行ファイルのあるパスにしてしまうという手もあります。


    おのでら (http://sorceryforce.com/)
    2011年6月3日 9:33
  • さっそくの回答ありがとうございます.

    なるほど,自分で指定しないとダメなのですね.

     (http://sorceryforce.com/)←見ました.

    今後参考にさせていただきます.

    2011年6月3日 9:57
  • あとは OFN_NOCHANGEDIR を付けて、そもそもディレクトリを変更させないというのもあるかもしれないですね。
    MSDN によると GetOpenFileName 関数だと効果がないように書かれていますが、Windows XP 以上だと効果があるかもしれないらしく...。
    2011年6月3日 10:07