枚举桌面应用程序lnk路径并得到对应程序的绝对路径(使用SHGetDesktopFolder函数枚举,然后使用COM查询IShellFolder,IShellLink和IPersistFile接口)

[cpp] view plain copy
 
  1. // 枚举桌面上应用程序的lnk路径  
  2. void EnumDesktopLnkPath()  
  3. {  
  4.     WCHAR szPath[MAX_PATH] = {0};  
  5.     SHGetSpecialFolderPathW(NULL, szPath, CSIDL_DESKTOPDIRECTORY, 0);  
  6.       
  7.     IShellFolder* pShell = NULL;  
  8.     if(FAILED(SHGetDesktopFolder(&pShell)))  
  9.     {  
  10.         return ;  
  11.     }  
  12.     IShellFolder* pFolder = NULL;  
  13.     ITEMIDLIST* pItem = NULL;  
  14.     if(FAILED(pShell->ParseDisplayName(NULL, NULL, szPath, NULL, &pItem, NULL)))  
  15.     {  
  16.         return ;  
  17.     }  
  18.     if(FAILED(pShell->BindToObject(pItem, NULL, IID_IShellFolder, (LPVOID*)&pFolder)))  
  19.     {  
  20.         return ;  
  21.     }  
  22.     pShell->Release();  
  23.       
  24.     if(NULL == pFolder)  
  25.     {  
  26.         return ;  
  27.     }  
  28.       
  29.     IEnumIDList* pEnum = NULL;  
  30.     if(FAILED(pFolder->EnumObjects(NULL, SHCONTF_NONFOLDERS, &pEnum)))  
  31.     {  
  32.         return ;  
  33.     }  
  34.     pItem = NULL;  
  35.     ULONG ulFetched = 0;  
  36.       
  37.     WCHAR szLnkPath[MAX_PATH] = {0};  
  38.     WCHAR szLnkName[MAX_PATH] = {0};  
  39.     LPCWSTR pszLnkName(L".lnk");  
  40.       
  41.     WIN32_FIND_DATAW fd = {0};  
  42.     while(S_OK == pEnum->Next(1, &pItem, &ulFetched))  
  43.     {  
  44.           
  45.         SHGetDataFromIDListW(pFolder, pItem, SHGDFIL_FINDDATA, &fd, sizeof(fd));  
  46.         swprintf(szLnkName, L"%s", fd.cFileName);  
  47.         if(0 == wcscmp(wcsrchr(szLnkName, L'.'), pszLnkName))  
  48.         {  
  49.             swprintf(szLnkPath, L"%s//%s", szPath, szLnkName);  
  50.             AfxMessageBox(CString(szLnkPath));  
  51.             //ParseLnk2Path(szLnkPath);  
  52.         }  
  53.     }  
  54.     pEnum->Release();  
  55.     pFolder->Release();  
  56. }  
  57.   
  58. // 由程序的Lnk路径得到对应的绝对路径  
  59. BOOL ParseLnk2Path(LPCWSTR pszLnkName)  
  60. {  
  61.     ::CoInitialize(NULL);  
  62.     IShellLink* pShell = NULL;  
  63.     IPersistFile* pFile = NULL;  
  64.     if(S_OK == ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&pShell))  
  65.     {  
  66.         if(S_OK == pShell->QueryInterface(IID_IPersistFile, (LPVOID*)&pFile))  
  67.         {  
  68.             pFile->Load(pszLnkName, STGM_READWRITE);  
  69.             TCHAR szPath[MAX_PATH] = {0};  
  70.             pShell->GetPath(szPath, MAX_PATH, NULL, SLGP_UNCPRIORITY);  
  71.             AfxMessageBox(CString(szPath));  
  72.         }  
  73.           
  74.     }  
  75.     pShell->Release();  
  76.     pFile->Release();  
  77.     ::CoUninitialize();  
  78.     return TRUE;  
  79. }  
 

http://blog.csdn.net/visualeleven/article/details/6433330 

原文地址:https://www.cnblogs.com/findumars/p/6002347.html