c/c++语言开发共享设置了OFN_ALLOWMULTISELECT标志的GetOpenFileName()

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

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

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

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

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

我已经看到MSDN中的注释说明如果缓冲区太小,lpstrFile缓冲区的前两个字节将包含所需的大小,但它返回的大小似乎太小(当OFN_ALLOWMULTISELECT不是’时,这可能是正确的’ t set)。 另外,这需要我再次打开对话框!

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

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


所以,事实certificate,Martlark的文章是正确的。

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

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

    所有这些都是令人愉快的非OO C!

      以上就是c/c++开发分享设置了OFN_ALLOWMULTISELECT标志的GetOpenFileName()相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/562422.html

      (0)
      上一篇 2021年2月4日
      下一篇 2021年2月4日

      精彩推荐