zoukankan      html  css  js  c++  java
  • 枚举桌面应用程序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 

  • 相关阅读:
    最常用的CountDownLatch, CyclicBarrier你知道多少? (Java工程师必会)
    浅谈Java中的Condition条件队列,手摸手带你实现一个阻塞队列!
    实习到公司倒闭,2019我的技术踩坑之路!
    Java中的等待唤醒机制—至少50%的工程师还没掌握!
    告别编码5分钟,命名2小时!史上最全的Java命名规范参考!
    解决SELinux阻止Nginx访问服务
    ZooKeeper使用入门
    JVM致命错误日志详解
    虚拟机中设置 CentOS 静态 IP
    Spring 核心技术(7)
  • 原文地址:https://www.cnblogs.com/findumars/p/6002347.html
Copyright © 2011-2022 走看看