【问题标题】:GetOpenFileName() with OFN_ALLOWMULTISELECT flag set设置了 OFN_ALLOWMULTISELECT 标志的 GetOpenFileName()
【发布时间】:2010-10-13 23:42:28
【问题描述】:

我正在尝试使用 GetOpenFileName() 通用对话框调用来弹出一个对话框并允许用户选择多个文件。

我设置了 OFN_ALLOWMULTISELECT 标志,以及设置了 OFN_EXPLORER,所以我得到了“新样式”文件选择框。

当我设置我的 OPENFILENAME 结构时,我将 ofn.lpstrFile 指向分配用于保存结果的缓冲区,并将 ofn.nMaxFile 设置为其长度。

我遇到的问题是,如果用户选择的文件名太多导致缓冲区溢出,则对 GetOpenFileName 的调用返回 FALSE,然后 CommDlgExtendedError() 返回 FNERR_BUFFERTOOSMALL。

这对于错误检测来说很好,我可以增加缓冲区的大小来修复它,但用户迟早会选择足够的文件名来溢出该缓冲区。

我在 MSDN 中看到了说明如果缓冲区太小,lpstrFile 缓冲区的前两个字节将包含所需的大小,但它返回的大小似乎太小了(也许这是正确的OFN_ALLOWMULTISELECT 未设置)。另外,这需要我再次打开对话框!

我的另一个想法是创建一个对话框挂钩过程,然后在收到 CDN_SELCHANGE 通知消息并动态分配正确大小的缓冲区时检测文件名的大小,但它会将数据写入新缓冲区,好像还记得ofn.nMaxFile的原始值。

有谁知道动态分配缓冲区以保存 GetOpenFile 调用的结果而不使对话框出现两次的正确方法?


所以,事实证明,Martlark 的文章是对的。

我的两个错误是:
1) 我忘记将 MAX_PATH 添加到要在钩子中应用的大小中,并且
2) 这仅适用于 GetOpenFileName 的 unicode 版本。 (我在编译时使用 UNICODE not 定义)

【问题讨论】:

  • 我很久以前就遇到过同样的问题。我正在努力记住我们是如何为你解决的!

标签: c++ c winapi dialog


【解决方案1】:

一个有趣的问题。我想您可以分配所有内存;以防万一!但本文档建议使用 Hook proc:

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

一切都在令人愉快的可理解的非 OO C 中!

【讨论】:

  • 这篇文章提出了一个与我尝试过的对话框钩子几乎完全相同的解决方案。 Prehaps 我需要查看我的代码以确保我没有做任何愚蠢的事情! -- 感谢一百万找到它,我的 google-fu 很弱。
  • 当只返回一个被暗示的文件名时要注意一个错误。 PS:使用实时搜索
猜你喜欢
  • 2018-08-10
  • 1970-01-01
  • 2010-11-23
  • 2011-03-09
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 2015-12-29
相关资源
最近更新 更多