Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当OFN_ALLOWMULTISELECT时,Windows API函数GetOpenFileName()的字符限制是否有解决方法?_C++_Windows_Visual Studio 2010_User Interface_Getopenfilename - Fatal编程技术网

C++ 当OFN_ALLOWMULTISELECT时,Windows API函数GetOpenFileName()的字符限制是否有解决方法?

C++ 当OFN_ALLOWMULTISELECT时,Windows API函数GetOpenFileName()的字符限制是否有解决方法?,c++,windows,visual-studio-2010,user-interface,getopenfilename,C++,Windows,Visual Studio 2010,User Interface,Getopenfilename,根据MSDN文档,当使用Windows 2000及更高版本为Unicode编译时,该函数没有字符限制,选项为N_ALLOWMULTISELECT。然而,在WindowsXPx64SP2上,我发现32k ANSI限制仍然有效,尽管使用了Unicode。我在网上看到过其他关于这个问题的投诉,但没有解决办法。有人知道一个简单的解决方法吗 完整,我使用VisualStudio 2010,C++中编码。 文档可能是错误的。GetOpenFileName()有些不推荐使用,它不再支持最新的Vista/Win

根据MSDN文档,当使用Windows 2000及更高版本为Unicode编译时,该函数没有字符限制,选项为N_ALLOWMULTISELECT。然而,在WindowsXPx64SP2上,我发现32k ANSI限制仍然有效,尽管使用了Unicode。我在网上看到过其他关于这个问题的投诉,但没有解决办法。有人知道一个简单的解决方法吗


完整,我使用VisualStudio 2010,C++中编码。

文档可能是错误的。GetOpenFileName()有些不推荐使用,它不再支持最新的Vista/Windows 7功能。更糟糕的是,GetOpenFileName()会弹出一个类似于Windows 95的打开对话框,至少当您尝试在Vista或Windows 7上使用LPOFNHOOKPROC功能自定义该对话框时是这样

从Vista和Windows Server 2008开始,新推荐的API是IFileDialog接口:。不幸的是,这在XP上不可用,因此您需要根据操作系统版本实现这两个API。如果需要在打开的对话框中添加一些自定义控件,则除了使用IFileDialogCustomize之外,别无选择


我知道你的问题是关于Windows XP的,我建议的解决方法对你没有帮助,但不幸的是,IFileDialog是GetOpenFileName()的唯一替代方法。

可能是一个迟来的答案,但我也不得不处理这个问题,并想提出我的解决方案,以防将来其他人遇到这个问题(如果您这样做,我表示哀悼)。对于那些想知道为什么要使用legacy GetOpenFileName()的人,如果您仍然使用legacy.NET 1.1,并且由于限制(在现实世界中,有时付钱给您这样做的个人或组织需要它),我们别无选择,只能受它的约束,所以请把批评放在一边,坚持OP的问题。还有一个很好的功能(我相信人们可以纠正我的错误)设置ALLOWMULTISELECT时,此方法实际上不会打开文件,因此您可以将其用作选择多个文件的接口,而无需占用作为流打开的每个文件的资源(即,想象多选择1000多个文件,每个文件都打开了一个流!-注意:.NET的OpenFileDialog也可以这样做,因为您必须显式调用OpenFile()方法来打开资源,因此可以迭代Filenames属性,尽管它可能会给出“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文章之后,如果我将WM_NOTIFY捕获为CDN_SELCHANGE,则使用相当大的缓冲区(即大于32KB)查询CDM_GETSPEC事实上,你可以捕获文件列表/集合大于32 KB限制。我道歉的是MSDN文章中描述的解决方案是C++而不是C++,但是最终结果应该是相同的。< /P>也许“无限制”的定义不同。长区域。单个文件的Ansi限制为MAX_PATH或260个字符iirc.AFAIK,单个文件路径的Unicode和Ansi限制为MAX_PATH(XP+上为260)。但我不确定“此缓冲区大小无效”区域的含义。OPENFILENAME结构中的缓冲区大小(请参阅)传递给GetOpenFileName的是一个DWORD(无符号长),因此限制应该远远大于32k。奇怪的问题。当然有一个解决方法,使用GetOpenFileNameW()。奇怪的答案。GetOpenFileNameW()是使用GetOpenFileName()时调用的函数并针对Unicode进行编译。因此,这就出现了同样的问题。我的意思是32K足够大,可能会超过缓冲区上过度偏执的健全性检查限制。+1在XP上运行时会降低限制,但只要可用,就切换到IFileDialog