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, то он работает.