根据MSDN文档,该功能 getopenfilename() 当使用Windows 2000及更大的Unicode编译Unicode时,没有选项的字符限制。但是,在Windows XP X64 SP2上,我发现尽管使用Unicode,但32K ANSI限制仍然有效。我在网络上看到了有关此问题的其他抱怨,但没有解决方案。有人知道这个简单的工作吗?

要完成,我正在使用Visual Studio 2010,并在C ++中进行编码。

有帮助吗?

解决方案

文档可能是错误的。 getopenfilename()有些贬低,它不再支持最新的Vista/Windows 7功能。更糟糕的是,GetopenfileName()弹出一个打开的对话框,看起来像Windows 95中的对话框,至少在您尝试使用Vista或Windows 7上的LPOFNHOUKPROC自定义对话框时。

从Vista和Windows Server 2008开始,新推荐的API是IfileDialog接口: http://www.codeproject.com/kb/vista/vgfiledialogs.aspx?msg=2368264. 。不幸的是,这在XP上不可用,因此您需要根据OS版本实现这两个API。如果您需要在打开的对话框中添加一些自定义控件,那么您别无选择,只能使用IfiledialogCustomize。

我意识到您的问题是关于Windows XP的,我建议的解决方法对您没有帮助,但是不幸的是,IfileDialog是GetopenfileName()的唯一替代方法。

其他提示

可能是一个较晚的答案,但是我也必须处理这个问题,并想提出我的解决方案,以防其他人在将来遇到这个问题(如果您这样做的话,我的慰问)。对于那些想知道为什么要使用遗留getopenfilename()的人,如果您陷入了遗产.NET 1.1并且由于限制(在现实世界中,有时候,有时候付款的人或组织都需要这样做),我们除了受到束缚之外,别无选择,因此请将批评抛在一边,坚持OP的问题。另外,一个不错的功能(我确定人们可以在此上纠正我)是,设置允许multiselect时实际上并未打开文件,因此您可以将其用作接口,而无需食用每个文件文件以流为流打开(即想象多选的1000多个文件,每个文件都为其打开了! - 注意:.NET的OpenFileDialog也可以做到这一点,因为您必须明确调用OpenFile()方法以打开资源,以便打开资源,因此FileNames属性是可能的,尽管它可能会提供“ InvalidOperationException:选择的文件太多”,如果您超过了我不知道的神秘限制)。

首先,尽管有什么 https://msdn.microsoft.com/en-us/library/windows/desktop/mms646927%28v=vs.85%299.aspx?f=255&mspperror = 2147217396 在讲话中说

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 ++,但是最终归值应该是相同的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top