おそらく遅い答えですが、私もこの問題に対処しなければならず、将来他の人がこれに遭遇した場合に備えて私の解決策を提示したかったのです (お悔やみを申し上げます)。なぜ従来の GetOpenFileName() を使用するのか疑問に思っている方のために、もしあなたが従来の .NET 1.1 で立ち往生していて、制限のために (現実の世界では、これを行うためにお金を払っている人や組織がそれを必要とする場合があります)、私たちはそれに縛られるしかないので、批判は脇に置いて、OPの質問に固執してください。また、1 つの優れた機能 (人々がこれについて私を修正できると確信しています) は、ALLOWMULTISELECT が設定されている場合、このメソッドは実際にはファイルを開かないため、それぞれのリソースを消費することなく複数のファイルを選択するためのインターフェイスとして使用できます。ストリームとして開かれたファイル (つまり 1000 以上のファイルを複数選択し、それぞれにストリームが開かれていると想像してみてください。- 注: リソースを開くには OpenFile() メソッドを明示的に呼び出す必要があるため、.NET の OpenFileDialog でもこれを行うことができます。私には手がかりがない制限)。
まず、https://msdn.microsoft.com/en-us/library/windows/desktop/ms646927%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396がコメントで次のように述べているにもかかわらず
Note, when selecting multiple files, the total character limit for the file names depends on the version of the function.
• ANSI: 32k limit
• Unicode: no restriction
「GetOpenFileNameW()」を明示的に呼び出すか、内部的に切り替えるかにかかわらず、Windows XPには32KBの制限があります(OPも言及しています)。調査する時間はありませんが、Win7 と Server 2012 (64 ビット) では、同じ API 呼び出しが (明らかに) Unicode モードに正しく切り替わり、32KB の制限をバイパスします。
https://msdn.microsoft.com/en-us/library/ms996463.aspx?f=255&MSPPError=-2147217396でMSDN の記事を読んだ後、CDN_SELCHANGE に対して WM_NOTIFY をトラップする場合、CDM_GETSPEC に対してクエリを実行することを発見しました。非常に大きなバッファ (つまり、32KB を超える) の場合、実際には、32KB の制限を超えるファイル リスト/コレクションをキャプチャできます。MSDN の記事で説明されているソリューションが C++ ではなく C# であることをお詫びしますが、最終結果は同じになるはずです。