使用SHGetPathFromIDList将PIDL转换为文件路径

时间:2012-05-16 10:53:36

标签: c++ winapi shell

我的应用程序收到一个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")

不幸的是,这段代码崩溃了。

3 个答案:

答案 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")