Ofn_allowMultisElectのWhen When When when when when when when when when when when when when when when when when when windows api functionの文字制限の回避策はありますか?
-
29-09-2019 - |
質問
MSDNドキュメントによると、関数 getopenfilename() Windows 2000以上のUnicode用にコンパイルされた場合、n_allowMultiselectのオプションで文字制限がありません。ただし、Windows XP X64 SP2では、Unicodeの使用にもかかわらず、32K ANSIの制限が依然として有効であることがわかりました。この問題の他の苦情はウェブ上で見たことがありますが、解決策はありません。誰かがこれのための単純な作業を知っていますか?
完了するために、Visual Studio 2010を使用し、C ++でコーディングしています。
解決
ドキュメントが間違っている可能性があります。 getopenfileName()はやや拒否されており、最新のVista/Windows 7の機能をサポートしなくなりました。さらに悪いことに、少なくともVistaまたはWindows 7のLPOFNHOOKPROC機能でダイアログをカスタマイズしようとすると、Windows 95のように見えるOpenダイアログがgetopenfileName()がポップアップすることです。
Vista and Windows Server 2008から始まり、新しい推奨APIはIfileDialogインターフェイスです。 http://www.codeproject.com/kb/vista/vgfileedialogs.aspx?msg=2368264. 。残念ながら、これはXPで利用できないため、OSバージョンに応じて両方のAPIを実装する必要があります。オープンダイアログにいくつかのカスタムコントロールを追加する必要がある場合は、とにかくIfileDialogizeを使用する以外に選択肢がありません。
私はあなたの質問がWindows XPに関するものであり、私の提案された回避策はあなたを助けませんが、残念ながらIfiledialogはgetopenfilename()の唯一の代替手段です。
他のヒント
おそらく遅い答えですが、私もこの問題に対処する必要があり、他の人が将来これに遭遇した場合に私の解決策を提示したいと思っていました(もしそうなら、私の哀dolの意的です)。レガシーgetopenfileName()を使用する理由を疑問に思う人のために、レガシー.NET 1.1に固執していて、制限のために(現実の世界では、これを行うために支払う人や組織がそれを必要とする場合があります)それに縛られる以外に他の選択肢はありませんので、批判を脇に置いて、OPの質問に固執してください。また、1つの優れた機能(私はこれで私を修正できると確信しています)です。この方法は、AllowMultisElectが設定されているときに実際にファイルを開かないことです。ストリームとして開かれたファイル(つまり、マルチ選択1000以上のファイルを想像して、それぞれがストリームを開くことを想像してください! - 注:.NETのOpenFileDialogは、OpenFile()メソッドを明示的に呼び出す必要があるため、これを行うことができます。 Filenamesプロパティは可能ですが、「InvalidoperationException:選択されたファイルが多すぎる」が、謎の制限を超えた場合、手がかりがない場合があります)。
第一に、何にもかかわらず 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呼び出しが正しく(明らかに)ユニコードモードに切り替わり、32kbの制限をバイパスします。
MSDNの記事を読んだ後、私はそれを発見しました https://msdn.microsoft.com/en-us/library/ms996463.aspx?f=255&mspperror=-2147217396 、cdn_selchangeをwm_notifyをトラップすると、非常に大きいバッファー(つまり32kbを超える)を使用してcdm_getSpecをクエリすると、実際には32kbの制限よりも大きいファイルリスト/コレクションをキャプチャできます。 MSDNの記事で説明されている解決策はC ++ではなくC#であることを謝罪しますが、最終結果は同じでなければなりません。