使用 SHGetPathFromIDList 将 PIDL 转换为文件路径
Converting a PIDL to file path with SHGetPathFromIDList
我的应用程序收到字符串形式的 PIDL:
QString pidl = "::{20D04FE1-3AEA-1069-A2D8-08002B30309B}";
在这种情况下,它对应于 My Computer
.我需要将其转换为My Computer
.
有一个 WINAPI 函数SHGetPathFromIDList
它要求LPCITEMIDLIST
作为第一个参数并将其转换为字符串。
我怎样才能建立那个LPCITEMIDLIST
?
更新
这是我到目前为止得到的:
LPCWSTR csPath = (LPCWSTR)"::{20D04FE1-3AEA-1069-A2D8-08002B30309B}";
LPITEMIDLIST stId = 0;
SFGAOF stSFGAOFIn = 0;
SFGAOF stSFGAOFOut = 0;
if(!FAILED(SHParseDisplayName(csPath, 0, stId, stSFGAOFIn, &stSFGAOFOut)))
msgBox("not failed")
不幸的是,此代码崩溃了。
您的代码崩溃,因为您没有正确设置 SHParseDisplayName()
的第一个和第 3 个参数。 试试这个:
LPCWSTR csPath = L"::{20D04FE1-3AEA-1069-A2D8-08002B30309B}";
PIDLIST_ABSOLUTE stId = NULL;
SFGAOF stSFGAOFIn = 0;
SFGAOF stSFGAOFOut = 0;
if (!FAILED(SHParseDisplayName(csPath, NULL, &stId, stSFGAOFIn, &stSFGAOFOut)))
msgBox("not failed")
你需要的功能不是SHGetPathFromIDList
,因为"我的电脑"没有路径。
要将 QString pidl 转换为PIDLIST_ABSOLUTE
,您需要使用 SHParseDisplayName
.
要将PIDLIST_ABSOLUTE
转换为本地化字符串(如"我的电脑"),您需要SHGetNameFromIDList
.
我认为
可能是:
SHParseDisplayName(csPath, 0, &stId, stSFGAOFIn, &stSFGAOFOut)
来自 MSDN 的 SHParseDisplayName 声明:
HRESULT SHParseDisplayName(
__in LPCWSTR pszName,
__in_opt IBindCtx *pbc,
__out PIDLIST_ABSOLUTE *ppidl,
__in SFGAOF sfgaoIn,
__out_opt SFGAOF *psfgaoOut
);
相关文章:
- 从函数角度看ID到文件路径的内部与外部映射
- 在C++中设置基于操作系统的文件路径
- Windows 非 ASCII 文件路径
- 非 ASCII 文件路径窗口
- C++和带有国家符号的文件路径(也许用 UTF8 编码)
- 如何为文件路径使用变量?
- 包括 VS Code 上的完整文件路径
- 如何使用提升获取当前文件路径?
- 如何在 c++ 中获取当前文件路径?
- 保存json文件后如何返回文件路径
- 从 C++ 中的文件路径中提取文件名
- 是否可以将文件路径传递给Qt中的setStyleSheet()
- 无法转换 .CATPart 文件.错误:输入文件路径似乎包含不支持的字符
- 在结构函数之间传递文件路径 C++ 编辑:修复LNK2019错误
- 提供依赖于输入的程序的文件路径
- 从 QFileSystemModel 中的文件路径和文件名获取 QModelIndex
- 如何更改变量文件名的文件路径?
- cmake:包括vs vs add_subDirectory:相对标头文件路径
- 在OSX中使用CGDisplayStream存储屏幕记录的特定文件路径
- 如何在另一个系统上启用文件路径