您的位置:首页 > 其它

SPDL: SHGetSpecialFolderLocation 获得系统特殊目录

2015-06-29 09:43 501 查看
关于得到 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_F***ORITES, &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  
		}  
	}     
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: