2011-03-05 110 views
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); 
... 

这工作得很好普通文件,但失败(E_INVALIDARG)当该文件是通过Windows 7的库文件夹中取出(同一个文件将工作时通过它的正常路径访问)。该doc说:IFileDialog /的IShellItem :: GetDisplayName不能与Windows 7工作图书馆

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)工作;

EDIT 2

我发现了什么是不工作,它是在CoInitializeEx的。我使用COINIT_MULTITHREADED,如果我将其更改为COINIT_APARTMENTTHREADED,则可以使用。

+0

你的第一个代码适合我。你用NULL参数调用pfd-> Show()吗? – Eugene 2011-03-05 08:05:59

回答

1

尝试调用

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

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

+0

这是一个CoInitializ.eEx问题。不管怎么说,还是要谢谢你。 – anno 2011-03-05 20:56:36