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则可以使用它。
答案 0 :(得分:1)
尝试拨打
pfd->SetOptions(dwOptions | FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST);
显示对话框之前。这对我有用。