关于得到 pidl (即:PathIDList)
的函数有:
SHGetSpecialFolderLocation(): 获得系统目录的位置
SHGetPathFromIDList (): 将
pidl 转化为文件夹路径
SHBrowseForFolder():
显示浏览文件夹对话框
SHBrowseForFolder()
是一个可以用于获取文件夹路径的Windows API
SHGetDesktopFolder()
函数原型:
WINSHELLAPI HRESULT WINAPI SHGetSpecialFolderLocation(
HWND hwndOwner,
int nFolder,
LPITEMIDLIST* ppidl
);
依赖文件:
#include <Shlobj.h>
#pragma once (lib, "Shell32.lib")
函数功能:
该函数获取一个特殊的文件夹的位置,比如我的电脑,回收站,台式机,打印机,字体,或各种文件系统的目录。
函数参数:
(1) hwndOwner: 处理的所有者窗口的客户端应该指定是否显示一个对话框或消息框。
(2) nFolder: 是一个整数id,决定哪个目录是待查找目录,它的取值可能是
CSIDL_BITBUCKET 回收站
CSIDL_CONTROLS 控制面板
CSIDL_DESKTOP Windows桌面desktop;
CSIDL_DESKTOPDIRECTORY desktop的目录;
CSIDL_DRIVES 我的电脑
CSIDL_FONTS 字体目录
CSIDL_NETHOOD 网上邻居,这是代表网络层次结构的顶层虚拟文件夹。
CSIDL_NETWORK 网上邻居virtual folder
CSIDL_PERSONAL 我的文档
CSIDL_PRINTERS 打印机
CSIDL_PROGRAMS 程序组
CSIDL_RECENT 最近打开文档
CSIDL_SENDTO 发送到菜单项
CSIDL_STARTMENU 开始菜单
CSIDL_STARTUP 启动目录
CSIDL_TEMPLATES 临时文档
CSIDL_PROFILE 文件夹包含用户的个人资料
CSIDL_WINDOWS Windows文件夹
CSIDL_PROGRAM_FILES Program Files文件夹
(3) ppidl: 指向一个LPITEMIDLIST结构,SHGetSpecialFolderLocation把地址写到pidl.
下面以在VC中使用为例来获取桌面路径,代码如下: LPITEMIDLIST ppidl; char lpsbuf[255] = {0}; SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP, &ppidl); SHGetPathFromIDList(ppidl, lpsbuf); MessageBox(lpsbuf);
示例代码VC++ LPITEMIDLIST pidl; LPMALLOC pShellMalloc; char szDir[200] = {0}; if(SUCCEEDED(SHGetMalloc(&pShellMalloc))) { if(SUCCEEDED(SHGetSpecialFolderLocation(NULL,CSIDL_DESKTOP, &pidl))) { <span style="white-space:pre"> </span>//如果成功返回true SHGetPathFromIDList(pidl, szDir); pShellMalloc->Free(pidl); } pShellMalloc->Release(); } ::MessageBox (NULL, szDir, "Path", MB_OK);
void CDlgTestDlg::OnBnClickedOk() { LPITEMIDLIST pidl; TCHAR szPath [MAX_PATH]; if(SUCCEEDED( SHGetSpecialFolderLocation ( NULL, CSIDL_FAVORITES, &pidl ))) { if ( SHGetPathFromIDList ( pidl, szPath )) { CString sDisplayName; SHFILEINFO sfi; ZeroMemory(&sfi,sizeof(sfi)); UINT uFlags = SHGFI_PIDL | SHGFI_DISPLAYNAME; SHGetFileInfo((LPCTSTR)pidl, 0, &sfi, sizeof(SHFILEINFO), uFlags); sDisplayName = sfi.szDisplayName; CString szDisplay; szDisplay.Format(_T(" %s /n /n %s"),szPath, sDisplayName); GetDlgItem(IDC_STATIC)->SetWindowText(szDisplay); CoTaskMemFree(pidl); //free the resource } } }