IFileDialog / IShellItem :: GetDisplayName不适用于Windows 7库

时间:2011-03-05 04:59:33

标签: c++ winapi com windows-7

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   该项目将失败。在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则可以使用它。

1 个答案:

答案 0 :(得分:1)

尝试拨打

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

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