IFileDialog / IShellItem :: GetDisplayName не работает с библиотеками Windows 7 - PullRequest
3 голосов
/ 05 марта 2011
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 (тот же файл будет работать при доступе по его обычному пути). документ говорит, что:

SIGDN_FILESYSPATH (Возвращает элемент путь к файловой системе, если он есть. Только элементы, которые сообщают SFGAO_FILESYSTEM есть путь к файловой системе. Когда предмет не имеет пути к файловой системе, вызовите IShellItem :: GetDisplayName на этот предмет потерпит неудачу . В интерфейсе это имя подходит для отображения пользователю в В некоторых случаях, но обратите внимание, что это не может быть указано для всех предметов.

Но использование 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, то он работает.

1 Ответ

1 голос
/ 05 марта 2011

Попробуйте позвонить

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

, прежде чем открывать диалоговое окно.Это работает для меня.

...