Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.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创建的文件对话框?_C++_Visual C++_Windows Vista_Getopenfilename - Fatal编程技术网

C++ 如何检测使用GetOpenFileName创建的文件对话框?

C++ 如何检测使用GetOpenFileName创建的文件对话框?,c++,visual-c++,windows-vista,getopenfilename,C++,Visual C++,Windows Vista,Getopenfilename,我参与了命名空间shell extension()的开发,其中包含一些文件夹中的文件列表。在WindowsVista上,使用n_ALLOWMULTISELECT的标志创建的“打开文件”对话框(OFD)有一些问题 如果应用程序使用使用IFileOpenDialog创建的OFD,我的NSE工作正常。 如果应用程序使用使用GetOpenFileName创建的OFD,并且用户选择了一些文件,则会得到错误的结果,因为此函数返回字符串: <Folder name>\0<File name

我参与了命名空间shell extension()的开发,其中包含一些文件夹中的文件列表。在WindowsVista上,使用n_ALLOWMULTISELECT的标志创建的“打开文件”对话框(OFD)有一些问题

如果应用程序使用使用IFileOpenDialog创建的OFD,我的NSE工作正常。 如果应用程序使用使用
GetOpenFileName
创建的OFD,并且用户选择了一些文件,则会得到错误的结果,因为此函数返回字符串:

<Folder name>\0<File name 1>\0<File name2>\0\0
\0\0\0\0
如果应用程序使用使用
GetOpenFileName
创建的OFD,我必须在NSE中使用单选模式

问题是:
这里有什么方法可以在我的NSE中检测到OFD是使用
GetOpenFileName
创建的?

旧的GetOpenFileName对话框从来都不是用来处理不同父文件夹中的多个文件的

试图通过检测使用的打开对话框的类型来修复此问题是错误的,GetOpenFileName可能只是新接口顶部的包装器


调用IShellFolder::EnumObjects方法时,请查找
SHCONTF\u平面列表
标志。如果未设置该标志,则应恢复到某种简单模式,其中所有项都具有相同的父项。我意识到这并不完全是标志的作用,但它可能是最好的非黑客解决方案。

你无法检测到这一点。听起来好像您想更改文件对话框的行为,而不是修复NSE中的错误。人们编写软件时使用多选文件对话框,因为他们,呃,想要选择多个文件。试图阻止这一点对用户非常不利。我在NSE和Windows搜索结果中测试了使用GetOpenFileName创建的OFD,得到了相同的错误。我认为,我的NSE返回正确的数据,但GetOpenFileName无法处理它,也无法将正确的文件名(包含子文件夹)放入结果字符串中。我不想改变OFD的行为,但如果它返回不正确的文件名,用户将得到一个错误“未找到文件”。我是否可以使用下一种方法:尝试从IShellBrowser获取IFileOpenDialog,如果此尝试成功,则OFD已使用IFileOpenDialog创建,否则使用GetOpenFileName。但我不确定是否可能。这不是一个不正确的结果,windows OFD就是这样定义多个选定文件的。必须有以下结果:\0\0\0\0\0\0。使用IFileOpenDialog创建的OFD在IShellItemArray中返回正确的结果