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

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

关于得到 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  
		}  
	}     
}