【问题标题】:IFileDialog / IShellItem::GetDisplayName doesn't work with Windows 7 librariesIFileDialog / IShellItem::GetDisplayName 不适用于 Windows 7 库
【发布时间】:2011-07-09 06:39:33
【问题描述】:
IFileDialog *pfd;
...
CoCreateInstance(CLSID_FileOpenDialog,NULL,
   CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&pfd));
...
IShellItem *psiResult;
pfd->GetResult(&psiResult);
...
wchar_t *filepath;
psiResult->GetDisplayName(SIGDN_FILESYSPATH,&filepath);
...

这对常规文件非常有效,但在通过 Windows 7 库文件夹获取文件时会失败 (E_INVALIDARG)(通过正常路径访问同一文件时也可以使用)。 doc 表示:

SIGDN_FILESYSPATH(返回项目的 文件系统路径,如果有的话。仅有的 报告 SFGAO_FILESYSTEM 的项目 有一个文件系统路径。 当一个项目 没有文件系统路径,a 调用 IShellItem::GetDisplayName on 该项目将失败。在 UI 中这个名字 适合显示给用户 在某些情况下,但请注意,它可能不会 为所有项目指定。

但使用 SIGDN_NORMALDISPLAY 或所有其他 SIGDN 枚举也失败。

那么当通过 Windows 7 库获取文件时如何获取完整路径?

编辑 1

我可以通过以下方式获取文件夹:

IShellItem *psiResult;
pfd->GetFolder(& psiResult); 
LPWSTR folderpath = NULL; 
psiResult->GetDisplayName(SIGDN_FILESYSPATH, & folderpath); 

但 GetDisplayName() 不适用于 pfd->GetResult(& psiResult);

编辑 2

我发现什么不起作用,它在 CoInitializeEx 中。我使用了 COINIT_MULTITHREADED,如果我将其更改为 COINIT_APARTMENTTHREADED,它就会起作用。

【问题讨论】:

  • 您的第一个代码对我有用。你用 NULL 参数调用 pfd->Show() 吗?

标签: c++ winapi com windows-7


【解决方案1】:

尝试调用

pfd->SetOptions(dwOptions | FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST);

在显示对话框之前。这对我有用。

【讨论】:

  • 这是一个 CoInitializ.eEx 问题。还是谢谢。
猜你喜欢
  • 2013-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多