关于c ++:设置了OFN_ALLOWMULTISELECT标志的GetOpenFileName()

GetOpenFileName() with OFN_ALLOWMULTISELECT flag set

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

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

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

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

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

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

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

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

因此,事实证明Martlark的文章对金钱是正确的。

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


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

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

所有令人愉悦的非OO C知识!