在Windows编程中,CItemIDList类是一个非常重要的类,它用于表示文件系统中的项目标识符列表(ITEMIDLIST)。这个类封装了对ITEMIDLIST结构的操作,提供了一系列的构造函数、成员函数和操作符重载,使得对文件系统的访问和管理变得更加方便和直观。本文将详细介绍CItemIDList类的构造函数、成员函数、操作符重载以及如何使用该类进行文件路径和信息的获取。
CItemIDList类提供了多种构造函数,以适应不同的使用场景:
CItemIDList(LPCTSTR pcszPath); // 通过路径字符串构造
CItemIDList(LPITEMIDLIST pidl); // 通过LPITEMIDLIST构造(复制,并在析构时释放)
CItemIDList(CItemIDList& iidl); // 通过另一个CItemIDList对象构造
CItemIDList(void); // 构造一个空的CItemIDList实例
这些构造函数使得可以从不同的数据源创建CItemIDList对象,无论是从文件路径、ITEMIDLIST指针还是另一个CItemIDList对象。
CItemIDList类提供了丰富的成员函数,用于获取和操作ITEMIDLIST:
int GetIconIndex(void) const; // 获取文件夹项目的图标索引
BOOL GetDisplayName(LPTSTR pszBuf, DWORD dwFlags=SHGDN_NORMAL) const; // 获取pidl的显示名称
CItemIDList Duplicate(UINT nCount=-1) const; // 根据数量复制pidl
inline BOOL IsEmpty(void) const; // 判断m_pidl是否为空
CItemIDList GetAt(UINT nIndex) const; // 返回指定索引处的相对pidl
BOOL Create(LPITEMIDLIST pidlf); // 从LPITEMIDLIST创建
inline UINT GetCount(void) const; // 获取pidl数量
inline UINT GetSize(void) const; // 获取pidl的大小(字节)
inline void Empty(void); // 释放m_pidl并设置为NULL
void GetPath(LPTSTR pszPath) const; // 获取完整路径(仅适用于完整质量pidl)
inline HRESULT GetUIObjectOf(REFIID riid, LPVOID* ppOut, HWND hWnd=NULL); // 获取其他Shell接口
inline void Split(LPSHELLFOLDER& lpsf, CItemIDList& ciid) const; // 从完整质量pidl获取IShellFolder接口和尾部pidl单元
CItemIDList GetLastPidl(void) const; // 获取尾部pidl单元
void GetToolTipInfo(LPTSTR pszToolTip, UINT cbSize) const; // 获取m_pidl的提示信息
void Attach(LPITEMIDLIST pidl); // 附加pidl
LPITEMIDLIST Detach(void); // 分离pidl
这些成员函数涵盖了从获取图标索引、显示名称、复制pidl、判断是否为空、获取路径、获取大小、获取其他Shell接口、分离和附加pidl等多种操作。
CItemIDList类还提供了操作符重载,使得对pidl的操作更加直观和方便:
CItemIDList operator+(CItemIDList& piidl); // 连接两个pidl
operator LPITEMIDLIST(void) const; // 获取m_pidl
operator LPCITEMIDLIST(void) const; // 获取m_pidl并转换为LPCITEMIDLIST
const CItemIDList& operator=(CItemIDList& ciidl1); // 从另一个类实例复制
const CItemIDList& operator=(LPITEMIDLIST pidl); // 从LPITEMIDLIST复制
operator +=(CItemIDList& ciidl); // 在m_pidl的尾部添加新的pidl
BOOL operator==(CItemIDList& ciidl); // 判断两个pidl的名称是否相同
CItemIDList operator[](UINT nIndex); // 返回指定索引处的相对pidl(与GetAt函数相同)
通过这些操作符重载,可以像操作普通变量一样操作CItemIDList对象,例如连接pidl、复制pidl、判断pidl是否相等等。
下面是一个使用CItemIDList类的示例代码,展示了如何获取文件的显示名称、路径、提示信息等:
#include "ItemIDList.h"
#include <windows.h>
#include <iostream>
int main() {
char szFile[MAX_PATH];
ZeroMemory(szFile, MAX_PATH);
OPENFILENAME info;
ZeroMemory(&info, sizeof(info));
info.lStructSize = sizeof(info);
info.lpstrFile = szFile;
info.hwndOwner = NULL;
info.nMaxFile = MAX_PATH;
if (GetOpenFileName(&info)) {
CItemIDList item(szFile), item2;
char szName[MAX_PATH];
item.GetDisplayName(szName);
std::cout << szName << std::endl;
item.GetToolTipInfo(szName, MAX_PATH);
std::cout << szName << std::endl;
item2 = item;
item2.GetPath(szName);
std::cout << szName << std::endl;
item2 = item[item.GetCount() - 1];
item2.GetDisplayName(szName);
std::cout << szName << std::endl;
item2 = item.GetAt(0);
item2.GetDisplayName(szName);
std::cout << szName << std::endl;
CItemIDList item3;
item3 = item.Duplicate(item.GetCount() - 1);
item3.GetPath(szName);
std::cout << szName << std::endl;
item3 = item.Duplicate(item.GetCount() - 1) + item2;
item3.GetPath(szName);
std::cout << szName << std::endl;
}
return 0;
}