SPDL: SHGetSpecialFolderLocation()、SHGetFileInfo()、SHGetPathFromIDList()函数

#include "shlobj.h" //包含头文件

函数介绍

1、WINSHELLAPI HRESULT WINAPI SHGetSpecialFolderLocation (HWND hwndOwner, int nFolder,LPITEMIDLIST * ppidl); //函数声明

hwndOwner: 指定了"所有者窗口",在调用这个函数是可能出現的对话框或信息框.

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_RECENT                          最近打开文档

CSIDL_SENDTO                          发送到菜单项

CSIDL_STARTMENU                    快启菜单

CSIDL_STARTUP                         启动目录

CSIDL_TEMPLATES                     临时文档

ppidl: pidl地址. SHGetSpecialFolderLocation把地址写到pidl.

2、SHGetFileInfo

包含在文件#include"shellapi.h"

DWORD SHGetFileInfo(    LPCTSTR pszPath,

DWORD dwFileAttributes,

SHFILEINFO FAR* psfi,

UINT cbFileInfo,

UINT uFlags);

SHGetFileInfo()函数提供关于文件系统对象的信息。这个对象可以是文件,文件夹,目录或驱动器根。DWORD的返回是指可能有相当多的返回状态,这与uFlags变量的设置有关。简单地说,使用这个函数,你可以期望:

确定可执行文件的目标平台(Win32,Win16,MS-DOS)

获取各种有特色的文件图标(小的,大的,有关联重叠的,选中的,打开的)

读出其它显示属性,如文件类型(显示在探测器类型列上的简短描述)和显示名(出现在名字列上)

读出任何其它属性,可以是文件特有的,如,是否可以拷贝,移动,删除或重命名,是否它可以形成一个快捷方式,它是否有子文件夹,是否是共享的,是拖拽目标,或有附加的属性页,等等。

3、SHGetPathFromIDList

从LPITEMIDLIST中获取文件路径

//这里给出的是项目中自己写的CDlgOpenSave类,显示我的桌面

void CDlgOpenSave::SetDeskTopList()

{

LPITEMIDLIST   lpItemIDList;

SHFILEINFO     shinfo;

ListItem       LI;

LPWSTR szPath = new TCHAR[MAX_PATH];

DWORD dwType[4] = {CSIDL_RECENT, CSIDL_PERSONAL, CSIDL_DRIVES, CSIDL_DESKTOPDIRECTORY};

FILETYPE FT[4] = {F_RECENT, F_PERSONAL, F_COMPUTER, F_DESKTOP};

CString strDisplayName,strPath;

for (int i=0; i < 4; i++)

{

::SHGetSpecialFolderLocation(m_hWnd, dwType[i], &lpItemIDList);

::SHGetFileInfo((LPCTSTR)lpItemIDList,NULL, &shinfo, sizeof(shinfo),

SHGFI_SYSICONINDEX | SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_SMALLICON | SHGFI_PIDL);

::SHGetPathFromIDList(lpItemIDList,szPath);

strDisplayName.Format(_T("%s"),shinfo.szDisplayName);

strPath.Format(_T("%s"), szPath);

if ( i == 3 )

{

m_strDesktop = strPath + _T("\");

m_nCurFolder = 0;

m_vFilePath.clear();

m_vFilePath.push_back(make_pair(m_strDesktop, F_DESKTOP));

ShowListContent(m_strDesktop,i);//显示桌面上的文件

delete[] szPath;

return;

}

if ( i== 2 )

{

strDisplayName = _T("我的电脑");

}

LI.strFileName = strDisplayName;

LI.strFilePath = strPath;

LI.dwFileType = FT[i];

OnNotifyShowListContent(strDisplayName, shinfo, i, LI);

}

delete[] szPath;

}

void CDlgOpenSave::ShowListContent(CString strPath, int nStartIndex)

{

int nFileType = m_pComFileType->GetCurSel();

CString strTypeName = _T("*.*");

if (nFileType > 0 && nFileType < (int)m_vFileType.size())

{

strTypeName = m_vFileType[nFileType];

}

CString strFullPath = strPath + strTypeName;

WIN32_FIND_DATA FindFileData;

int nlength = nStartIndex;

HANDLE hListFile = ::FindFirstFile((LPTSTR)(LPCTSTR)strFullPath, &FindFileData);

if (hListFile != INVALID_HANDLE_VALUE)

{

do

{

CString strFilePathName;

strFilePathName = strPath;

CString strFileName;

strFileName.Format(_T("%s"), FindFileData.cFileName);

strFilePathName += strFileName;

int nHide = (FindFileData.dwFileAttributes) & FILE_ATTRIBUTE_HIDDEN;//过滤隐藏属性

if (!nHide)

{

ShowFileToList(strPath, strFileName,nlength); //ShowFileToList接口

}

}while( ::FindNextFile(hListFile, &FindFileData) );

::FindClose(hListFile);

}

UpdateGobackBtnState();

}

//根据路径将打开的文件显示在对话框列表中

void CDlgOpenSave::ShowFileToList(CString strFilePath, CString strFileName, int &length)

{

if ( strFileName.Compare(_T("."))  ==0 || strFileName.Compare(_T("..") ) ==0 )

return;

CString strPathName = strFilePath + strFileName;

SHFILEINFOW fileInfo;

DWORD_PTR dwPtr = ::SHGetFileInfoW(strPathName,FILE_ATTRIBUTE_HIDDEN, &fileInfo, sizeof(SHFILEINFO), SHGFI_DISPLAYNAME | SHGFI_ICON | SHGFI_TYPENAME);

if (IsShowFile(strPathName))

{

ListItem itList;//这个是自定义的结构体,来存储文件信息

itList.strFileName = strFileName;

itList.strFilePath = strFilePath;

itList.dwFileType = F_NORMAL;

OnNotifyShowListContent(strFileName, fileInfo,length, itList);//添加到界面列表中

length++;

}

else if(::PathIsDirectory(strPathName + _T("\")))

{

ListItem itList;

itList.strFileName = strFileName;   //文件名

itList.strFilePath = strFilePath;

itList.dwFileType = F_NORMAL;

OnNotifyShowListContent(strFileName, fileInfo, length, itList);

length++;

}

}

时间: 2024-10-29 10:45:40

SPDL: SHGetSpecialFolderLocation()、SHGetFileInfo()、SHGetPathFromIDList()函数的相关文章

WindowsAPI开发常用资料

主类 子类 功能 Win32API SHGetSpecialFolderLocation 获取系统特殊文件夹路径(SHGetSpecialFolderLocation)通过 SHGetSpecialFolderLocation.SHGetPathFromIDList 函数获取常用路径 OutputDebugString 使用OutputDebugString将调试信息输出 MakeSureDirectoryPathExists MakeSureDirectoryPathExistsC/C++中判

[转]用 GetEnvironmentVariable 获取常用系统环境变量

以前曾用 GetWindowsDirectory.GetSystemDirectory.GetTempPath 等函数获取系统常用文件夹; 也用过 SHGetSpecialFolderLocation.SHGetPathFromIDList 函数获取过更多常用路径; 但这都不如用 GetEnvironmentVariable 获取系统变量来得快. //譬如 %WINDIR% 是表示系统目录的系统变量, 可以这样获取: var   s: string; begin   s := GetEnviro

Delphi深度探索之PItemIDList的基本概念

PIDL的秘密 从Windows 95开始,微软公司为操作系统引入了新的外壳界面,新的外壳从根本上改变了应用程序同操作系统的结合方式,遗憾的是微软公司对于发布同外壳相关的编程信息方面显得很吝啬,可以得到的资料非常少,而且质量也不高.对于Delphi开发者来说,情况就更为严重了,因为几乎所有的Windows API 文档都是针对C/C++程序员的,但是Nothing is impossible,在本文中,我们将开始外壳编程的历险,就让我们从PIDL开始吧. 外壳命名空间 新外壳系统中的一个核心概念

【大话QT之五】Windows与Linux下文件操作监控的实现

一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场上网盘实现有一些的不同,主要在客户端与服务器端的操作需要双向进行,即:用户在客户端的操作需要及时同步到服务器端:在服务器端作业渲染生成的文件要及时同步到客户端.即:用户不在需要单独的下载数据,而是在作业运行的同时,渲染就过就会自动同步到客户端,大大缩短了等待时间.当然,无论是在客户端还是在服务端都面

Windows与Linux下文件操作监控的实现

一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场上网盘实现有一些的不同,主要在客户端与服务器端的操作需要双向进行,即:用户在客户端的操作需要及时同步到服务器端:在服务器端作业渲染生成的文件要及时同步到客户端.即:用户不在需要单独的下载数据,而是在作业运行的同时,渲染就过就会自动同步到客户端,大大缩短了等待时间.当然,无论是在客户端还是在服务端都面

SPDL: SHGetSpecialFolderLocation 获得系统目录的位置

关于得到 pidl (即:PathIDList) 的函数有: SHGetSpecialFolderLocation():    获得系统目录的位置 SHGetPathFromIDList ():              将 pidl 转化为文件夹路径 SHBrowseForFolder():                  显示浏览文件夹对话框 SHBrowseForFolder()                   是一个可以用于获取文件夹路径的Windows API SHGetDesk

SHGetFileInfo函数详解

SHGetFileInfo函数: WINSHELLAPI DWORD WINAPI SHGetFileInfo( LPCTSTR pszPath, DWORD dwFileAttributes, SHFILEINFO FAR *psfi, UINT cbFileInfo, UINT uFlags ); pszPath 参数:指定的文件名. 当uFlags的取值中不包含 SHGFI_PIDL时,可直接指定; 当uFlags的取值中包含 SHGFI_PIDL时pszPath要通过计算获得,不能直接指

SPDL -- SHGetFileInfo

本文从一下几个方法进行介绍: SHGetFileInfo的定义  SHGetFileInfo()函数的工作原理  SHGetFileInfo()函数的返回值  SHGetFileInfo()函数的简单示例 SHGetFileInfo的定义 SHGetFileInfo在MSDN上的定义是: Retrieves information about an object in the file system, such as a file, folder, directory, or drive roo

delphi公用函数

{*******************************************************} { } { Delphi公用函数单元 } { } { 版权所有 (C) 2008 } { } {*******************************************************} unit YzDelphiFunc; interface uses ComCtrls, Forms, Windows, Classes, SysUtils, ComObj,