当前位置:  开发笔记 > 编程语言 > 正文

设置了OFN_ALLOWMULTISELECT标志的GetOpenFileName()

如何解决《设置了OFN_ALLOWMULTISELECT标志的GetOpenFileName()》经验,为你挑选了0个好方法。

我正在尝试使用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调用结果而不使对话框出现两次的正确方法?


因此,事实证明,Martlark的文章是正确的.

我的2个错误是:
1)我忘了将MAX_PATH添加到钩子中的applcate大小,
2)这只适用于GetOpenFileName的unicode版本.(我是用UNICODE编译没有定义)

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有