我的应用程序收到一个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")
不幸的是,这段代码崩溃了。
答案 0 :(得分:2)
您需要的功能不是SHGetPathFromIDList
,因为“我的电脑”没有路径。
要将您的QString pidl转换为PIDLIST_ABSOLUTE
,您需要使用SHParseDisplayName
。
要将PIDLIST_ABSOLUTE
转换为“我的电脑”等本地化字符串,您需要SHGetNameFromIDList
。
答案 1 :(得分:2)
我想可能是:
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
);
答案 2 :(得分:2)
您的代码崩溃了,因为您没有正确设置SHParseDisplayName()
的第一个和第三个参数。试试这个:
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")