C++获取快速启动文件夹下快捷方式所指向的原路径
所以,
第一步就是找到快速启动文件夹所在位置,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);
}
调用说明:
ListAllFileInDrectory(_T("C:\\Users\\HP\\AppData\\Roaming\\Microsoft\\Internet Explorer\\Quick Launch"));