c++ - 获取普通文件对话框中当前选中文件的真实名称?

标签 c++ windows com openfiledialog comctl32

可以在公共(public)对话框的 ListView 中获取所选项目的文本。但是无法获取其 PIDL,并且如果用户选择隐藏已知扩展名(默认设置),那么在没有其扩展名或 PIDL 的情况下就无法真正分辨出选择了哪个文件。

解决这个问题的可能方法是:

  1. 从 标准的打开文件对话框。这 底层 IShellView 可以告诉什么 PIDL 是针对当前 选择。所以如果我能简单地得到 持有 IShellView,我会 金的。不幸的是,我没有看到 CDM_xxx 可以做到这一点。和我 无法想出我的头顶 任何可能实现它的东西! :(
  2. 还有其他想法吗?!

我们曾经依赖于 Windows 9x、2000 和 XP 版本的公共(public)文件对话框将每个项目的 PIDL 存储在 LVITEM 数据中这一事实(Paul DiLascia 的原始信用):

LPCITEMIDLIST pidlItem = (LPCITEMIDLIST)pListCtrl->GetItemData(nItem);

但是,从 Vista 的通用控件和更高版本开始,该技术失败了:(

有什么想法吗?

编辑:我不仅需要能够获取 ListView 中当前所选项目的信息,还需要获取 ListView 中所有项目的信息。

EDIT2:我需要深入挖掘的原因:

在我们应用程序的早期版本中,我们提供了以下功能:(1) 按自定义按钮“预览”关闭对话框,但将当前显示在 View 中的项目列表按可见顺序传输到应用程序,以及当前突出显示的索引。此列表必须完全指定 - 看到 3 个文件都是“J1329192”(当确实有 3 个文件“J1329192.xyz”、“J1329192.xzy”和“J1329192.zyx”[按此顺序)时没有用。

允许用户在“文件名:”字段中输入部分文件名过滤器,公共(public)对话框将按照用户选择的排序顺序仅显示与给定部分过滤器匹配的文件。因此,要向应用准确报告用户想要预览的内容,我们需要能够从 ListView 控件(或公共(public)对话框本身)中查询该信息。

我们还对文件对话框进行了其他改进 - 包括一个以缩略图形式显示用户当前选择的就地预览 Pane ,以及一个自定义的最近位置界面等。所有这些都是可能的(有很多工作)在 Vista 之前。发布 Vista 后,我遇到了一个接一个的墙。目前,我们使用标准的文件对话框,其中只有很少的我们自己的功能,这对客户来说不太合适(功能 X 怎么了?!)

还有其他增强功能,但这是一个很好的粗略概述。它们都归结为需要了解“真的,老实说,在索引 X 的 View 中具体是什么文件?”而且出于未知的原因——微软似乎并不觉得有必要提供这样的界面。事实上他们从来没有这样做过。只有通过一些黑客攻击和逆向工程,我们才能弄清楚引擎盖下的工作原理并获得所需的信息。是的,这是不受支持的,是的,MS 不可避免地破坏了我们的代码。我并不是真的为此责怪他们——我确实发现令人讨厌的是他们更新、更漂亮的界面比他们的旧界面封闭得多——而且他们没有提供更多的前期界面——支持的界面——来进行这些对话框增强.就像他们向后退了一大步 - 而没有向前(以进步的名义)。

最佳答案

发送WM_USER+7获取浏览器,然后获取其事件的 shell View 的 IShellView 接口(interface)。

您知道使用未记录行为的通常后果吗?

关于c++ - 获取普通文件对话框中当前选中文件的真实名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1757093/

相关文章:

com - 是否有允许 URL 编码的 COM 可访问库?

.net - 如何找到未记录的 .NET/COM 库函数?

C++ 如何创建双类运算符 [][]

c++ - 在字符串常量之前预期为 ‘,’ 或 ‘...’

windows - 从 Visual C++ 构建中删除未使用的 .lib 文件

Windows 7 的 AndroidViewClient 安装

c++ - 用C++实现一棵树

c++ - std:map 与 operator= 不匹配

windows - 什么是 Teredo 隧道伪接口(interface)?

c++ - ATL COM 类注册 .rgs 文件默认值