根据MSDN文档,函数GetOpenFileName()在使用Windows 2000或更高版本的Unicode进行编译时,没有字符限制,选项为OFN_ALLOWMULTISELECT。 但是,在Windows XP x64 SP2上,尽pipe使用了Unicode,但我发现32k ANSI限制仍然有效。 我在网上看到了这个问题的其他投诉,但没有解决scheme。 有没有人知道这个简单的解决办法?
为了完整,我使用Visual Studio 2010,并使用C ++进行编码。
文档可能是错误的。 GetOpenFileName()已经被弃用了,它不再支持最新的Vista / Windows 7功能。 更糟糕的是,GetOpenFileName()会弹出一个类似于Windows 95的打开对话框,至少当您尝试使用Vista或Windows 7上的LPOFNHOOKPROC功能自定义对话框时。
从Vista和Windows server 2008开始,新推荐的API是IFileDialog接口: http : //www.codeproject.com/KB/vista/VGFileDialogs.aspx ?msg=2368264。 不幸的是,这在XP上不可用,因此您需要根据操作系统版本来实现这两个API。 如果您需要在“打开”对话框中添加一些自定义控件,则根本没有选择,只能使用IFileDialogCustomize。
我意识到你的问题是关于Windows XP,我建议的解决方法不会帮助你,但不幸的是,IFileDialog是GetOpenFileName()的唯一替代方法。
可能是一个迟到的答案,但我也不得不处理这个问题,并想提出我的解决方案,以防其他人在未来遇到这种情况(如果你这样做,我的哀悼)。 对于那些奇怪的为什么要使用传统的GetOpenFileName(),如果你坚持传统的.NET 1.1,并由于限制(在现实世界中,有人或组织付钱给你这样做需要它),我们别无选择,只能束缚它,所以请把批评放在一边,坚持OP的问题。 此外,一个很好的功能(我敢肯定人们可以纠正我)是因为这个方法实际上并没有打开文件时ALLOWMULTISELECT设置,因此你可以使用它作为一个接口,选择多个文件,而不吃每个资源文件打开为流(即想象多选择1000+文件,并且每个都有一个打开的流!注意:.NET的OpenFileDialog也可以做到这一点,因为你必须显式调用OpenFile()方法打开资源,因此迭代文件名属性是可能的,虽然它可能会给“InvalidOperationException:太多的文件选择”,如果你超出了我不知道的神秘极限)。
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调用将正确切换(显然)切换到Unicode模式,并跳过32KB的限制。
我发现在阅读MSDN上的文章https://msdn.microsoft.com/en-us/library/ms996463.aspx?f=255&MSPPError=-2147217396 ,如果我陷阱WM_NOTIFY为CDN_SELCHANGE,查询然后为CDM_GETSPEC与一个非常大的缓冲区(即大于32KB),实际上可以捕获大于32KB限制的文件列表/集合。 我很抱歉,MSDN文章中描述的解决方案是C#而不是C ++,但最终结果应该是相同的。