ItemIDList结构(文件路径的转换)

本文介绍如何将文件路径转换为ItemIDList,以便在Windows应用程序中作为文件夹浏览窗口的根目录。通过使用SHGetDesktopFolder和ParseDisplayName等API,可以实现自定义浏览窗口的初始显示位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章转载自网络


将文件路径转换至ItemIDList

通常我们会用SHBrowseForFolder接口来打开一个文件夹浏览窗口,代码一般如下:

BROWSEINFO bi = { 0 };
LPITEMIDLIST pItemIDList = SHBrowseForFolder( &bi );

这样就会打开一个浏览文件夹窗口,如下:

SHBrowseForFolder接口传入的参数为BROWSEINFO结构体指针,该结构体指针中有个ItemIDList指针成员pidlRoot,即为打开浏览文件夹窗口后显示的根目录,如果该形参为NULL,那么桌面将为根目录。

现在,我们打算将根目录置为任何我想显示的文件路径,该怎么做呢?那么我们就要将文件路径转换到对应的ItemIDList,然后赋值给pidlRoot。

首先我们要得到桌面的目录,代码如下:


LPSHELLFOLDER pDesktopFolder = NULL;
HRESULT hr = SHGetDesktopFolder( &pDesktopFolder );
if ( FAILED(hr) )
{
 return NULL;
}

然后通过调用ParseDisplayName接口就可以得到文件路径对应的ItemIDList了,由于ParseDisplayName的形参类型为LPOLESTR,所以我们需要先转化,代码如下:

OLECHAR strOleFilePath[MAX_PATH];
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, strFilePath.c_str(), -1, strOleFilePath, MAX_PATH );

然后,我们就可以调用ParseDisplayName去得到文件路径对应的ItemIDList了,代码如下:

LPITEMIDLIST pItemIDList = NULL;
hr = pDesktopFolder->ParseDisplayName( NULL, NULL, strOleFilePath, NULL, &pItemIDList, NULL );
pDesktopFolder->Release();
if ( FAILED(hr) )
{
 return NULL;
}

这样我们就得到了文件路径对应的ItemIDList,然后就可以以它为根目录显示了,代码如下:

BROWSEINFO bi = { 0 };
bi.pidlRoot = GetItemIDListFromFilePath( "F:\\NewtonSDK" ); // 返回NULL也没关系,以桌面为根

LPITEMIDLIST pItemIDList = SHBrowseForFolder( &bi );


好了,至此我们的任务就完成了,以上仅供大家参考,谢谢^-^!

附上完整代码:

LPITEMIDLIST GetItemIDListFromFilePath( const std::string &strFilePath )
{
 if ( strFilePath.empty() )
 {
  return NULL;
 }

 // 得到桌面的目录
 LPSHELLFOLDER pDesktopFolder = NULL;
 HRESULT hr = SHGetDesktopFolder( &pDesktopFolder );
 if ( FAILED(hr) )
 {
  return NULL;
 }

 // 将文件路径转换至OLECHAR格式
 OLECHAR strOleFilePath[MAX_PATH];
 MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, strFilePath.c_str(), -1, strOleFilePath, MAX_PATH );

 // 得到文件路径对应的ItemIDList
 LPITEMIDLIST pItemIDList = NULL;
 hr = pDesktopFolder->ParseDisplayName( NULL, NULL, strOleFilePath, NULL, &pItemIDList, NULL );
 pDesktopFolder->Release();
 if ( FAILED(hr) )
 {
  return NULL;
 }

 return pItemIDList;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值