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,它就可以工作了。