1

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

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

4

3 回答 3

2

您需要的功能不是SHGetPathFromIDList,因为“我的电脑”没有路径。

要将您的 QString pidl 转换为PIDLIST_ABSOLUTE您需要使用的SHParseDisplayName.

要将其转换PIDLIST_ABSOLUTE为本地化字符串,如“我的电脑”,您需要SHGetNameFromIDList.

于 2012-05-16T11:30:48.940 回答
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
);
于 2012-05-16T17:18:00.980 回答
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") 
于 2012-05-16T18:18:16.893 回答