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,则可以使用。
你的第一个代码适合我。你用NULL参数调用pfd-> Show()吗? – Eugene 2011-03-05 08:05:59