5

GetOpenFileName() コモン ダイアログ ボックス呼び出しを使用してダイアログ ボックスを開き、ユーザーが複数のファイルを選択できるようにしようとしています。

OFN_ALLOWMULTISELECT フラグ セットと OFN_EXPLORER セットがあるので、「新しいスタイル」のファイル選択ボックスが表示されます。

OPENFILENAME 構造体をセットアップするとき、ofn.lpstrFile が結果を保持するために割り当てられたバッファーを指し、ofn.nMaxFile がその長さに設定されています。

私が抱えている問題は、ユーザーがバッファがオーバーフローするほど多くのファイル名を選択した場合、GetOpenFileName の呼び出しが FALSE を返し、次に CommDlgExtendedError() が FNERR_BUFFERTOOSMALL を返すことです。

エラー検出には問題ありません。バッファのサイズを大きくして修正することもできますが、遅かれ早かれ、ユーザーはバッファをオーバーフローするのに十分なファイル名を選択することになります。

バッファが小さすぎる場合、lpstrFile バッファの最初の 2 バイトに必要なサイズが含まれるという MSDN のメモを見たことがありますが、返されるサイズが小さすぎるようです (おそらく、OFN_ALLOWMULTISELECT が「設定します)。さらに、これにはダイアログをもう一度開く必要があります。

私が持っていたもう1つの考えは、ダイアログフックプロシージャを作成し、CDN_SELCHANGE通知メッセージを取得してファイル名のサイズを検出し、正しいサイズのバッファを動的に割り当てることでしたが、新しいバッファにデータを書き込みますが、 ofn.nMaxFile の元の値を記憶します。

ダイアログを2回表示せずにGetOpenFile呼び出しの結果を保持するためにバッファを動的に割り当てる正しい方法を知っている人はいますか?


したがって、Martlark の記事は大筋であることがわかりました。

私の 2 つの間違いは次のとおりです
。1) フックに適用するサイズに MAX_PATH を追加するのを忘れていました
。2) これは GetOpenFileName の Unicode バージョンでのみ機能します。(UNICODE未定義でコンパイルしていました)

4

1 に答える 1

4

興味深い問題。すべてのメモリを割り当てることができると思います。念のため!ただし、このドキュメントでは、フックプロシージャの使用を提案しています。

http://support.microsoft.com/kb/131462

そして、すべてが楽しく理解できる非OO Cです!

于 2009-03-18T03:12:56.623 に答える