CItemIDList类详解

在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; }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485