【WIN32】【C/C++】获取快捷方式指向的位置

本文介绍如何在Windows系统中找到并遍历快速启动栏的文件夹,获取其中的快捷方式及其指向的原始文件路径。

由于一个项目中涉及到一个功能,需要将系统任务栏上的快速启动功能加入程序中,
所以,
第一步就是找到快速启动文件夹所在位置,Windows XP一般在
C:\Documents and Settings\+用户名+\Application Data\Microsoft\Internet Explorer\Quick Launch下,
Windows Vista 一般在C:\Users\+用户名+\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch下,
如我的系统是Vista,用户名为HP,所以路径为C:\Users\HP\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch
第二步就是遍历文件夹,构造快捷方式的全路径。
第三步就是根据快捷方式全路径获取它所指向的原路径。
代码如下



/* ************************************
\* DWORD ListAllFileInDrectory(LPCWSTR szPath)
\* 功能 遍历目录及所有子目录,打印路径
*
\* 参数 LPCWSTR szPath,为需遍历的目录
*
\* 返回值 0代表执行完成,1代码发生错误
**************************************/
DWORD CShellFile::ListAllFileInDrectory(LPCWSTR szPath)
{
	HANDLE hListFile;
	WIN32_FIND_DATA FindFileData;
	WCHAR szFilePath[MAX_PATH];
	WCHAR szFullPath[MAX_PATH]; 

	//构造代表子目录和文件夹路径的字符串,使用通配符“*”
	lstrcpy(szFilePath, szPath);
	lstrcat(szFilePath, _T("\\*"));
	//查找第一个文件/目录,获得查找句柄
	hListFile = FindFirstFile(szFilePath,&FindFileData);

	if(hListFile==INVALID_HANDLE_VALUE)
	{
		printf("错误:%d",GetLastError());
		return 1;
	}
	else
	{ 
		do
		{
			// 过滤“.”和“..”,不需要遍历
			if(lstrcmp(FindFileData.cFileName,TEXT("."))==0 || lstrcmp(FindFileData.cFileName,TEXT(".."))==0)
			{
				continue;
			}
			//构造成全路径
			wsprintf(szFullPath,_T("%s\\%s"),szPath,FindFileData.cFileName);

			CString fileExt=CString(szFullPath).Mid(CString(szFullPath).ReverseFind( '.')+1);//文件扩展名
			if (fileExt == _T("lnk"))//不是快捷方式的不要
			{
				WCHAR  buf[MAX_PATH]; 
				if(GetShortCutFile(szFullPath,buf,sizeof(buf))) 
				{  
					if (CString(buf).Mid(CString(buf).ReverseFind('.')+1) == _T("exe"))//不是exe的不要
					{   
						HICON hIcon1,hIcon2;//大小图标的资源句柄
						::ExtractIconExW(CString(buf),0,&hIcon1,&hIcon2,1);

						MessageBox(NULL,CString(buf),_T(""),MB_OK);
					}
				}  
			}

			//如果是目录,则递归调用,列举下级目录
			if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
			{
				TRACE(_T("<DIR>"));
				ListAllFileInDrectory(szFullPath);  
			}  
		}
		while(FindNextFile(hListFile, &FindFileData));
	}

	return 0;
}



/* ************************************
\* bool GetShortCutFile(WCHAR* ShortcutFile,WCHAR* buf,int nSize) 
\* 功能 获取快捷方式所指向的原路径
*
\* 参数 ShortcutFile:快捷方式全路径
*
\* 返回值 
**************************************/
bool  CShellFile::GetShortCutFile(WCHAR* ShortcutFile,WCHAR* buf,int nSize) 
{ 
	HRESULT      hres; 
	IShellLink    *psl; 
	IPersistFile   *ppf; 
	WIN32_FIND_DATA  fd;


	hres = CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,
		IID_IShellLink,(void**)&psl); 
	if(!SUCCEEDED(hres)) 
		return  false; 

	hres = psl->QueryInterface(IID_IPersistFile,(void**)&ppf); 
	if(SUCCEEDED(hres)) 
	{ 
		//wchar_t wsz[MAX_PATH];  //buffer  for  Unicode  string
		//MultiByteToWideChar(CP_ACP,0,ShortcutFile,-1,wsz,MAX_PATH); 
		//hres = ppf->Load(wsz,STGM_READ);
		hres = ppf->Load(ShortcutFile,STGM_READ);
		if(SUCCEEDED(hres)) 
			hres = psl->GetPath(buf,nSize,&fd,0); 
		ppf->Release(); 
	} 
	psl->Release(); 

	return SUCCEEDED(hres); 
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧恩意

如有帮助,感谢打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值