2

MSDN のドキュメントによると、関数GetOpenFileName()は、Windows 2000 以降で Unicode 用にコンパイルされた場合、オプション OFN_ALLOWMULTISELECT で文字制限がありません。ただし、Windows XP x64 SP2 では、Unicode を使用しているにもかかわらず、32k ANSI 制限がまだ有効であることがわかりました。この問題に関する他の苦情をウェブで見ましたが、解決策はありません。これに対する簡単な回避策を知っている人はいますか?

完全にするために、私は Visual Studio 2010 を使用し、C++ でコーディングしています。

4

2 に答える 2

4

ドキュメントが間違っている可能性があります。GetOpenFileName() はやや非推奨になり、最新の Vista/Windows 7 機能をサポートしなくなりました。さらに悪いことに、少なくとも Vista または Windows 7 で LPOFNHOOKPROC 機能を使用してダイアログをカスタマイズしようとすると、GetOpenFileName() が Windows 95 のような [開く] ダイアログをポップアップします。

Vista および Windows Server 2008 以降、推奨される新しい API は IFileDialog インターフェイスです: http://www.codeproject.com/KB/vista/VGFileDialogs.aspx?msg=2368264。残念ながら、これは XP では利用できないため、OS のバージョンに応じて両方の API を実装する必要があります。[開く] ダイアログにいくつかのカスタム コントロールを追加する必要がある場合は、とにかく IFileDialogCustomize を使用するしかありません。

あなたの質問は Windows XP に関するものであり、私が提案した回避策は役に立たないことを認識していますが、残念ながら IFileDialog が GetOpenFileName() の唯一の代替手段です。

于 2010-11-05T17:11:40.790 に答える
1

おそらく遅い答えですが、私もこの問題に対処しなければならず、将来他の人がこれに遭遇した場合に備えて私の解決策を提示したかったのです (お悔やみを申し上げます)。なぜ従来の 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# であることをお詫びしますが、最終結果は同じになるはずです。

于 2015-05-18T21:02:36.837 に答える