【发布时间】:2011-07-09 06:39:33
【问题描述】:
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 on 该项目将失败。在 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() 吗?