IFileDialog / IShellItem::GetDisplayName在Windows 7库中无法使用

3
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)(当通过普通路径访问该文件时,同一文件将正常工作)。文档说:
SIGDN_FILESYSPATH (返回项的文件系统路径(如果有)。仅报告SFGAO_FILESYSTEM的项具有文件系统路径。当某个项没有文件系统路径时,对该项调用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,它就可以工作了。


你的第一段代码对我来说是有效的。你是用NULL参数调用了pfd->Show()吗? - Eugene
1个回答

1

尝试调用

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

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

这是一个CoInitializeEx问题。不管怎样,谢谢。 - anno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接