SPDL: SHGetSpecialFolderLocation 获得系统特殊目录

关于得到 pidl (即:PathIDList) 的函数有:
SHGetSpecialFolderLocation():    获得系统目录的位置,存储到LPITEMIDLIST结构变量 pidl

SHGetPathFromIDList ():              将 pidl 转化为文件夹路径

SHBrowseForFolder():                  显示浏览文件夹对话框

SHBrowseForFolder()                   是一个可以用于获取文件夹路径的Windows API

SHGetDesktopFolder()       


函数原型:

WINSHELLAPI HRESULT WINAPI SHGetSpecialFolderLocation(
  HWND hwndOwner, 
  int nFolder, 
  LPITEMIDLIST* ppidl 
);

依赖文件:
#include <Shlobj.h>
#pragma comment (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  
		}  
	}     
}  






你可能感兴趣的:(SPDL: SHGetSpecialFolderLocation 获得系统特殊目录)