我正在使用 SHCreateItemFromParsingName
将一个 路径 转换为 IShellItem
:
IShellItem ParseName(String path)
{
IShellItem shellItem;
HRESULT hr = SHCreateItemFromParsingName(path, null, IShellItem, out shellItem);
if (Failed(hr))
throw new ECOMException(hr);
return shellItem;
}
注意:大约在2006年左右引入了一个名为
IShellItem
的东西,它提供了一个方便的包装器,用于封装Windows 95时代的IShellFolder
+pidl
结构。您甚至可以使用IParentAndItem.GetParentAndItem
接口和方法要求IShellItem
呕出其底层的IShellFolder
和pidl
。
不同的事物有不同的显示名称
我可以获取一些在shell命名空间中广为人知的位置,并查看它们的绝对解析(SIGDN_DESKTOPABSOLUTEPARSING
)和编辑(SIGDN_DESKTOPABSOLUTEEDITING
)显示名称:
路径 | 编辑 | 解析 |
---|---|---|
C:\ | "C:" | "C:" |
C:\Windows | "C:\Windows" | "C:\Windows" |
桌面 | "桌面" | "C:\Users\Ian\Desktop" |
此电脑 | "此电脑" | "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" |
回收站 | "回收站" | "::{645FF040-5081-101B-9F08-00AA002F954E}" |
文档库 | "库\文档" | "::{031E4825-7B94-4DC3-B131-E946B44C8DD5}\Documents.library-ms" " |
启动项 | "C:\Users\Ian\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup" | "C:\Users\Ian\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup" |
当用户在其中输入文本时如何解析它们?
我可以使用 IFileOpenDialog
让用户选择其中一个文件夹。但我真的希望用户能够 键入
- "C:\Users"
- "C:\Windows\Fonts"
- "This PC"
- "Recycle Bin"
- "Libraries"
- "Startup"
- "Fonts"
并将其解析为 IShellItem
。
问题是,SHCreateItemFromParsingName
无法解析其中一些路径:
SHCreateItemFromParsingName("C:\")
: 解析SHCreateItemFromParsingName("C:\Windows")
: 解析SHCreateItemFromParsingName("")
: 解析(但变成"This PC")SHCreateItemFromParsingName("This PC")
: 失败SHCreateItemFromParsingName("Recycle Bin")
: 失败SHCreateItemFromParsingName("Libraries")
: 失败SHCreateItemFromParsingName("OneDrive")
: 失败SHCreateItemFromParsingName("Libraries\Documents")
: 失败SHCreateItemFromParsingName("Network")
: 失败SHCreateItemFromParsingName("Startup")
: 失败
真正的问题是,我希望用户能够拥有一个包含以下内容的最近使用列表:
- C:\Windows
- 回收站
- 此电脑
并且以后能够解析它们。
IShellFolder::ParseDisplayName
。 - Jonathan Potter