MFC アプリケーションのファイル選択ダイアログで、パスが 258 文字しか返却されない

適用対象: Visual Studio Premium 2010Visual Studio Professional 2010Visual Studio Ultimate 2010

現象


MFC アプリケーションにて、ファイル選択ダイアログ (CFileDialog クラス) からファイルを選択します。ファイルへのパスが 259 文字のファイルを選択すると、GetPathName メンバ関数で取得される文字列が、1 文字欠けた 258 文字しか返却されません。 

原因


この問題はMFC の CFileDialog クラスの不具合により発生します。

回避策


  1. IFileDialog を使用する
    Windows Vista 以降の OS では、ファイル ダイアログは IFileDialog インターフェイスを使用することができます。MFC を介さずに、IFileDialog のファイル ダイアログを利用することにより、本不具合を回避することができます。

    IFileDialog インターフェイスの詳細は、以下の技術情報を参照してください。

    IFileDialog interface
    http://msdn.microsoft.com/en-us/library/windows/desktop/bb775966(v=vs.85).aspx

    IFileDialog のサンプル コードは、以下のコード レシピを参照してください。

    Show Shell common file dialog (CppShellCommonFileDialog)
    http://code.msdn.microsoft.com/CppShellCommonFileDialog-c18192c7

  2. Vista スタイルを false にし、CFileDialog を使用する
    本不具合は、MFC の CFileDialog クラスが、Windows Vista 以降の OS が提供するファイル ダイアログを使用する場合に実行されるコード パスに依存して発生します。
    CFileDialog クラスでは、コンストラクタの第 8 引数 (BOOL bVistaStyle) の値に応じて、Vista スタイルのダイアログを利用するか、従来のものを利用するかを切り替えることが可能です。このため、従来のスタイルのファイル ダイアログを利用することで、見た目や操作感は Windows XP 以前の従来のものとなるものの、不具合を回避することができます。

    CFileDialog のコンストラクタの詳細は、以下の技術情報を参照してください。

    CFileDialog::CFileDialog
    http://msdn.microsoft.com/ja-jp/library/wh5hz49d(v=vs.100).aspx

  3. GetOpenFileName 関数を使用する

    GetOpenFileName 関数を使用することで、Vista スタイルでない従来のファイル ダイアログを利用することができます。MFC を介さず、GetOpenFileName 関数のファイル ダイアログを利用することにより、本不具合を回避することができます。

    GetOpenFileName 関数の詳細は、以下の技術情報を参照してください。

    GetOpenFileName
    http://msdn.microsoft.com/ja-jp/library/cc364716.aspx

状況


マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。