调用windows api SHMultiFileProperties 显示多文件的汇总属性
2016-07-15 18:40
471 查看
代码如下: 1 // csFilePath 文件路径,以|分隔。 nPathes 路径数。
2 void CGetDirectoryDlg::ShowPropertiesByPath(CString csFilePath,int nPathes)
3 {
4 if(csFilePath.IsEmpty())
5 {
6 return;
7 }
8 //单个文件属性
9 if(nPathes == 1)
{
SHELLEXECUTEINFO sei;
ZeroMemory(&sei,sizeof(sei));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.hwnd = m_hWnd;
sei.lpParameters = NULL;
sei.nShow = 0;
sei.lpIDList = NULL;
sei.hInstApp = 0;
sei.lpFile = csFilePath;//要显示属性的文件
sei.lpVerb = L"properties";
sei.fMask = SEE_MASK_IDLIST | SEE_MASK_NOCLOSEPROCESS | SEE_MASK_INVOKEIDLIST |
SEE_MASK_FLAG_NO_UI;
ShellExecuteEx(&sei);
return;
}
//多个文件属性
LPITEMIDLIST *pidlDrives = (LPITEMIDLIST *)malloc(sizeof(LPITEMIDLIST)*nPathes);
IShellFolder* psfDesktop;
IDataObject* pData;
HRESULT hr;
ULONG chEaten=0, dwAttributes=0;
int i=0;
hr = SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, pidlDrives);
if (SUCCEEDED(hr))
{
hr = SHGetDesktopFolder(&psfDesktop);
do{
CString currentFilePath;
int delimitatorPosition;
delimitatorPosition = csFilePath.Find(L'|');
if(delimitatorPosition == -1)
{
delimitatorPosition = csFilePath.GetLength();
}
currentFilePath = csFilePath.Left(delimitatorPosition);
csFilePath.Delete(0, delimitatorPosition + 1);
psfDesktop->ParseDisplayName(NULL,
NULL,
currentFilePath.GetBuffer(),
&chEaten,
(LPITEMIDLIST*)&pidlDrives[i],
&dwAttributes);
i++;
}while(!csFilePath.IsEmpty() && i<nPathes);
if (SUCCEEDED(hr))
{
hr = psfDesktop->GetUIObjectOf(NULL,
nPathes,
(LPCITEMIDLIST*)pidlDrives,
IID_IDataObject,
NULL,
(void**)&pData);
if (SUCCEEDED(hr))
{
CoInitialize(NULL);
hr = SHMultiFileProperties(pData,0);
if(SUCCEEDED(hr))
{
pData->Release();
}
CoUninitialize();
}
if(psfDesktop != NULL)
{
psfDesktop->Release();
}
}
for(i=0;i<nPathes;i++)
{
ILFree(pidlDrives[i]);
}
}
}
88 //调用方法:ShowPropertiesByPath(L"D:\\Share\\v.txt|D:\\Share\\sh.txt", 2);
2 void CGetDirectoryDlg::ShowPropertiesByPath(CString csFilePath,int nPathes)
3 {
4 if(csFilePath.IsEmpty())
5 {
6 return;
7 }
8 //单个文件属性
9 if(nPathes == 1)
{
SHELLEXECUTEINFO sei;
ZeroMemory(&sei,sizeof(sei));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.hwnd = m_hWnd;
sei.lpParameters = NULL;
sei.nShow = 0;
sei.lpIDList = NULL;
sei.hInstApp = 0;
sei.lpFile = csFilePath;//要显示属性的文件
sei.lpVerb = L"properties";
sei.fMask = SEE_MASK_IDLIST | SEE_MASK_NOCLOSEPROCESS | SEE_MASK_INVOKEIDLIST |
SEE_MASK_FLAG_NO_UI;
ShellExecuteEx(&sei);
return;
}
//多个文件属性
LPITEMIDLIST *pidlDrives = (LPITEMIDLIST *)malloc(sizeof(LPITEMIDLIST)*nPathes);
IShellFolder* psfDesktop;
IDataObject* pData;
HRESULT hr;
ULONG chEaten=0, dwAttributes=0;
int i=0;
hr = SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, pidlDrives);
if (SUCCEEDED(hr))
{
hr = SHGetDesktopFolder(&psfDesktop);
do{
CString currentFilePath;
int delimitatorPosition;
delimitatorPosition = csFilePath.Find(L'|');
if(delimitatorPosition == -1)
{
delimitatorPosition = csFilePath.GetLength();
}
currentFilePath = csFilePath.Left(delimitatorPosition);
csFilePath.Delete(0, delimitatorPosition + 1);
psfDesktop->ParseDisplayName(NULL,
NULL,
currentFilePath.GetBuffer(),
&chEaten,
(LPITEMIDLIST*)&pidlDrives[i],
&dwAttributes);
i++;
}while(!csFilePath.IsEmpty() && i<nPathes);
if (SUCCEEDED(hr))
{
hr = psfDesktop->GetUIObjectOf(NULL,
nPathes,
(LPCITEMIDLIST*)pidlDrives,
IID_IDataObject,
NULL,
(void**)&pData);
if (SUCCEEDED(hr))
{
CoInitialize(NULL);
hr = SHMultiFileProperties(pData,0);
if(SUCCEEDED(hr))
{
pData->Release();
}
CoUninitialize();
}
if(psfDesktop != NULL)
{
psfDesktop->Release();
}
}
for(i=0;i<nPathes;i++)
{
ILFree(pidlDrives[i]);
}
}
}
88 //调用方法:ShowPropertiesByPath(L"D:\\Share\\v.txt|D:\\Share\\sh.txt", 2);
相关文章推荐
- centos之lnmp
- 进程管理
- Hadoop-MapReduce操作
- 浅谈MVP架构的实现方式(架构思想)
- linux下实现tomcat6.0的单机多实例
- 在CentOS中搭建Gogs服务器
- Linux系统管理命令之accton的使用
- ARM架构下编译ekho的记录
- Linux下格式化U盘及分区
- linux的一些命令
- Hadoop2.6分布式集群安装配置
- 函数getopt(),及其参数optind
- linux rpm 安装包 信息查询
- Linux下项目发布tomcat常用命令操作
- winscp 连接 linux
- 基础总结篇之二:Activity的四种launchMode
- 在windows上安装单节点Hardoop
- 什么是架构师
- linux下mysql安装
- MVC与框架