Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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++ 我可以使GetOpenFileName返回路径比MAX_路径长吗?_C++_Winapi_Mfc - Fatal编程技术网

C++ 我可以使GetOpenFileName返回路径比MAX_路径长吗?

C++ 我可以使GetOpenFileName返回路径比MAX_路径长吗?,c++,winapi,mfc,C++,Winapi,Mfc,我正在使用API,或者在我的例子中,使用MFC的CFileDialog来打开文件,就像它一样(除了一个文件选择——即,我在m_of n.lpstrFile中提供了我自己的较长缓冲区) 它可以正常工作,除非用户选择的文件路径超过MAX\u path-1(或259)个字符。在这种情况下,会发生以下情况: 在我的Windows 8.1上,它将用户选择的路径转换为古老的8.3短文件格式:“C:\TESTDE~1\NEWFOL~1” 在Windows XP上,我甚至无法选择任何内容,我得到以下信息:

我正在使用API,或者在我的例子中,使用MFC的CFileDialog来打开文件,就像它一样(除了一个文件选择——即,我在
m_of n.lpstrFile
中提供了我自己的较长缓冲区)

它可以正常工作,除非用户选择的文件路径超过
MAX\u path-1
(或259)个字符。在这种情况下,会发生以下情况:

  • 在我的Windows 8.1上,它将用户选择的路径转换为古老的8.3短文件格式:
    “C:\TESTDE~1\NEWFOL~1”

  • 在Windows XP上,我甚至无法选择任何内容,我得到以下信息:


所以我很好奇,既然操作系统本身支持长的Unicode路径,前缀是
\\?\
(包括XP),那么有没有办法诱使GetOpenFileName以该格式返回路径,而不受259个字符的限制?

Windows文件对话框,甚至是新的Vista
IFileDialog
,返回的文件名长度不会超过
MAX\u PATH

您是否使用了N_LONGNAMES的
?@MariusBancila:
OFN_LONGNAMES
仅适用于旧式对话框以关闭8.3文件名。它不允许对话框使用“\\?”。
\\?\
仅适用于低级文件I\O函数,如
CreateFile()
。它不适用于更高级别的API,如Shell接口和对话框。这是Shell和相关对话框的实现者所做的选择。他们可能选择允许这些对话框返回转义文件名,这似乎是合理的。但他们没有。我想总结一下:“shell和文件系统有不同的要求。可以使用Windows API创建一个shell用户界面无法正确解释的路径”<代码>\\?\
仅适用于文件系统,不适用于UI。当然,UI实现者可以支持语法,但他们不支持。不同层次的编程。层次不在其中。他们只是选择不支持“\\?”。Windows 10 insider版本现在有一个组策略,允许>MAX\u路径,即使没有\\?\前缀,并且Explorer将支持它们,因此在某个时候事情会发生变化。。。