none
GetSaveFileName()で、存在しないフォルダを選択しても、正常リターンさせる方法 RRS feed

  • 質問

  • いつも大変お世話になっています。

    WIN7 x64  VS2010 で開発しています。

    GetSaveFileNameを使用して保存ファイル名を入力後、OKボタンを押すと
    「パスが存在しません。・・・」のメッセージが表示され、GetSaveFileNameから戻ってきません。

    確かに存在しないフォルダ名を入力したのですが、存在しない場合は作成してから保存したいのです。

    Xpでは出なかったのですが、Windows7(64ビット)では出ます。

    OPENFILENAME構造体のFlagsの設定が悪いのかと思うのですが、よくわかりません。

    memset(&ofn,0,sizeof(OPENFILENAME));
    ofn.lStructSize=sizeof(OPENFILENAME);
    ofn.hwndOwner=hwnd;
    ofn.lpstrFilter=szFilter;
    ofn.lpstrFile=szFileName;
    ofn.nMaxFile=FILENAMEMAX;
    ofn.lpstrFileTitle=szFileTitle;
    ofn.nMaxFileTitle=FILETITLEMAX;
    ofn.lpstrInitialDir=TestDirectory;
    ofn.Flags=OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_NOTESTFILECREATE;
    ofn.lpstrDefExt=FILENAMEEXT;

    return GetSaveFileName(&ofn);

    相対パスは入力したフォルダがない場合でもGetSaveFileNameから戻ってきますが
    ”c:\aaa\bbb\test.txt”のように絶対パスで入力したときメッセージが表示され戻ってきません。

    やり方を御存知の方がおられましたら、ご指導よろしくお願いいたします。


    2014年3月11日 6:15

回答

  • Xpでは出なかったのですが、Windows7(64ビット)では出ます。
    OPENFILENAME構造体のFlagsの設定が悪いのかと思うのですが、よくわかりません。。

    仮にそうだとすれば、MSDN のフラグの説明 のところにあるものの組み合わせを試していくことになると思います。
    実際には、Windows のバージョンが変わったことによる仕様変更、あるいは不具合の可能性も考えるべきでしょう。

    ドキュメントに明確に書かれていない振る舞いは変更されることがあります。(書かれていても変更されることもありますが…)
    白黒はっきりつけたい場合は、Microsoft の技術サポートを頼ることになります。

    • 回答としてマーク kizakura_ui 2014年3月12日 4:14
    2014年3月11日 14:09
    モデレータ
  •  1点、尋ねたいことがあります。
    日本語の GetSaveFileName 関数の説明は、Windows 2000 の頃から更新が止まっていますが、英語の GetSaveName Function の説明には、こう書かれています。

    [Starting with Windows Vista, the Open and Save As common dialog boxes have been superseded by the Common Item Dialog. We recommended that you use the Common Item Dialog API instead of these dialog boxes from the Common Dialog Box Library.]

    「Windows Vista からは、「Open」および「Save As」コモン ダイアログ ボックスは、コモン アイテム ダイアログに置き換えられました。コモン ダイアログ ボックス ライブラリのダイアログ ボックスよりも、コモン アイテム ダイアログ API を使用することを勧めます。」

     このことはご存じの上で、Windows 7 において GetSaveFileName 関数を使用されているのでしょうか。


    Jitta@わんくま同盟

    • 回答としてマーク kizakura_ui 2014年3月13日 8:54
    2014年3月12日 12:08

すべての返信

  • OFN_CREATEPROMPT をつけてみてはどうでしょう。
    (追記) すみません。「存在しないファイル」の場合は上なのですが、フォルダは試してません。

    2014年3月11日 6:24
  • ご回答、ありがとうございました。

    エラーメッセージが出ないようにしたいのですが、

    このフラグを立てると、メッセージが出てしまいます。

    引き続き、ご指導よろしくお願いいたします。

    2014年3月11日 6:40
  • すみません。OFN_CREATEPROMPT は真っ逆さまのフラグでした。無視してください。
    2014年3月11日 9:38
  • Xpでは出なかったのですが、Windows7(64ビット)では出ます。
    OPENFILENAME構造体のFlagsの設定が悪いのかと思うのですが、よくわかりません。。

    仮にそうだとすれば、MSDN のフラグの説明 のところにあるものの組み合わせを試していくことになると思います。
    実際には、Windows のバージョンが変わったことによる仕様変更、あるいは不具合の可能性も考えるべきでしょう。

    ドキュメントに明確に書かれていない振る舞いは変更されることがあります。(書かれていても変更されることもありますが…)
    白黒はっきりつけたい場合は、Microsoft の技術サポートを頼ることになります。

    • 回答としてマーク kizakura_ui 2014年3月12日 4:14
    2014年3月11日 14:09
    モデレータ
  •  1点、尋ねたいことがあります。
    日本語の GetSaveFileName 関数の説明は、Windows 2000 の頃から更新が止まっていますが、英語の GetSaveName Function の説明には、こう書かれています。

    [Starting with Windows Vista, the Open and Save As common dialog boxes have been superseded by the Common Item Dialog. We recommended that you use the Common Item Dialog API instead of these dialog boxes from the Common Dialog Box Library.]

    「Windows Vista からは、「Open」および「Save As」コモン ダイアログ ボックスは、コモン アイテム ダイアログに置き換えられました。コモン ダイアログ ボックス ライブラリのダイアログ ボックスよりも、コモン アイテム ダイアログ API を使用することを勧めます。」

     このことはご存じの上で、Windows 7 において GetSaveFileName 関数を使用されているのでしょうか。


    Jitta@わんくま同盟

    • 回答としてマーク kizakura_ui 2014年3月13日 8:54
    2014年3月12日 12:08
  • ご回答、ありがとうございます。

    全く知りませんでした。

    さっそく調べてみます。

    2014年3月13日 8:55