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

Converting a PIDL to file path with SHGetPathFromIDList

本文关键字:文件 路径 转换 PIDL SHGetPathFromIDList 使用      更新时间:2023-10-16

我的应用程序收到字符串形式的 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
);