您的位置:首页 > 运维架构

调用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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: