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"));

posted @ 2009-10-06 16:03  trace007  阅读(3786)  评论(3编辑  收藏  举报