Как разобрать путь хлебных крошек Проводника, например «Этот ПК\вкладка Galaxy A\Card\Folder1», используя API оболочки Windows?

Когда пользователь перешел в проводнике Windows, например, к папку на SD-карте своего Android-телефона, Проводник показывает что-то вроде навигационной цепочки, например "This PC\Galaxy Tab A\Card\Folder1", когда щелкаешь в адресной строке.

Проводник Windows также принимает такие пути при вводе или копировании их в адресной строке и нажатии возврата.

Интересно, есть ли способ проанализировать такие пути хлебных крошек с помощью Shell API и получить взамен PItemIDList или IShellItem. До сих пор мне не удалось использовать, например. SHParseDisplayName(). Этот код

LPITEMIDLIST itemidlist;
HRESULT hr = SHParseDisplayName(L"This PC\\Galaxy Tab A\\Card\\testfolder", NULL, &itemidlist, 0, NULL);

вернул 0x80070002 как HRESULT.

Вопрос SHParseDisplayName, когда путь не существует касается вопроса о том, как использовать IBindCtx для анализа пути к файлу, который еще не существует. Это можно сделать с помощью контекста привязки STR_FILE_SYS_BIND_DATA. Но объекты на мобильном устройстве не являются данными файловой системы, и они уже существуют, поэтому я не понимаю, почему это дубликат.


person Joachim Marder    schedule 03.05.2016    source источник
comment
До сих пор мне не удалось использовать, например. SHParseDisplayName() - Что вы пробовали. Как это не оправдало ваших ожиданий? Кроме того, чего вы на самом деле пытаетесь достичь?   -  person IInspectable    schedule 03.05.2016
comment
SHParseDisplayName() не удалось с ошибкой, я добавил код ошибки. Чего я пытаюсь добиться, так это получить PItemIdList or IShellItem` для пути хлебной крошки Explorer, который мне нужен для операций контекстного меню Shell.   -  person Joachim Marder    schedule 03.05.2016
comment
Возможный дубликат SHParseDisplayName, когда путь не существует   -  person Simon Mourier    schedule 03.05.2016
comment
@RemyLebeau - да, OP должен передавать контекст, как в вашем ответе, поэтому я думаю, что это дубликат   -  person Simon Mourier    schedule 04.05.2016
comment
@Simon: Я тоже это подозревал, но как должен выглядеть IBindCtx в случае мобильных устройств или папки WebDAV? STR_FILE_SYS_BIND_DATA, указанный в качестве примера, не будет работать.   -  person Joachim Marder    schedule 08.05.2016
comment
Он должен работать. Вы должны показать пример кода и какую ошибку вы получаете   -  person Simon Mourier    schedule 08.05.2016
comment
@Simon: я добавил пример кода, но это только одна довольно прямая строка, плюс объявление переменной плюс включает.   -  person Joachim Marder    schedule 09.05.2016
comment
Как описано в дубликате, вы должны создать IBindCtx с помощью CreateBindCtx, установить для его параметров значение STR_FILE_SYS_BIND_DATA с помощью SetBindOptions и передать его в SHParseDisplayName. Вы не можете передать ноль   -  person Simon Mourier    schedule 09.05.2016
comment
@Simon: Не могли бы вы объяснить, почему я должен использовать STR_FILE_SYS_BIND_DATA для объекта, отличного от файловой системы? связанный пример кода в блоге ONT ожидает WIN32_FIND_DATAW - откуда это? Пример кода заполняет свои элементы атрибутами и размером. Одной из причин, по которой мне нужно получить ItemIdList объекта на мобильном устройстве, является то, что я хочу запросить такие метаданные.   -  person Joachim Marder    schedule 09.05.2016
comment
Это работает или нет? Пожалуйста, прочитайте повторяющийся вопрос и ответ   -  person Simon Mourier    schedule 09.05.2016
comment
@Simon: я прочитал повторяющийся вопрос и ответил несколько раз. Это просто не соответствует моему вопросу, оно имеет дело с данными файловой системы, но объекты на мобильном устройстве не являются данными файловой системы. Основные причины: я не хочу создавать простой PIDL для файловой системы, и у меня нет метаданных для заполнения структуры WIN32_FIND_DATAW, так как это метаданные, которые я хочу запросить. Пожалуйста, ответьте на вопрос, почему я должен использовать STR_FILE_SYS_BIND_DATA для объекта, не являющегося файловой системой?   -  person Joachim Marder    schedule 10.05.2016