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

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

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

  1. 【C#】获取当前系统桌面、我的照片、我的文档等路径

    获取当前系统桌面.我的照片.我的文档等路径   using System; using System.Collections.Generic; using System.ComponentModel; ...

  2. JAVA文件中获取路径及WEB应用程序获取路径方法

    JAVA文件中获取路径及WEB应用程序获取路径方法 1. 基本概念的理解 `绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL.物理路径 例如: c:/xyz/test.txt代表了tes ...

  3. 二叉树中和为某一值的路径 牛客网 程序员面试金典 C++ Python

    二叉树中和为某一值的路径 牛客网 程序员面试金典 题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一 ...

  4. mac通过wine运行windows程序(将文件关联到windows程序notepad++)

    windows程序功能强大且已经习惯使用了,用mac总感觉不给力,例如记事本工具Notepad++就非常优秀.下面介绍如何在mac系统下通过wine来安装使用notepadd++程序. 1.安装win ...

  5. 使用LabVIEW如何生成应用程序(exe)和安装程序(installer)

    主要软件:   LabVIEW Development Systems>>LabVIEW Professional Development System主要软件版本:   2012主要软件 ...

  6. 在Vista以上版本运行WTL程序,有时候会提示“这个程序可能安装补正确...”的错误

    在Win7/Vista下,如何以兼容模式运行exe?     https://msdn.microsoft.com/en-us/library/dd371711(VS.85).aspx     问题描 ...

  7. 《微信小程序七日谈》- 第六天:小程序devtool隐藏的秘密

    <微信小程序七日谈>系列文章: 第一天:人生若只如初见: 第二天:你可能要抛弃原来的响应式开发思维: 第三天:玩转Page组件的生命周期: 第四天:页面路径最多五层?导航可以这么玩: 第五 ...

  8. 应用程序初次运行数据库配置小程序(Java版)

    应用程序初始化数据库配置小程序 之前写过一个Java版的信息管理系统,但部署系统的时候还需要手动的去配置数据库和导入一些初始化的数据才能让系统运行起来,所以我在想是不是可以写一个小程序在系统初次运行的 ...

  9. 简述在ADO中使用接口的抽象数据提供程序以及ADO.NET数据提供程序工厂模型

    如何在ADO中使用接口的抽象数据提供程序 在cofig中 appSettings下,配置数据连接类型 <appSettings> <!--这个键值映射到枚举值中的某个值--> ...

随机推荐

  1. php中fopen函数用法详解(打开文件)

    介绍下php中的fopen函数. 1.resource  fopen(string  $filename, string $mode [,bool $use_include_path [, resou ...

  2. ref和out

    网上对这两个关键字的讨论,已经很多了,先给出一个链接:http://blog.csdn.net/xiaoning8201/article/details/6893154 自己做几条笔记,记得牢一些: ...

  3. 【转载】MySQL查询阻塞语句

    select r.trx_id waiting_trx_id, r.trx_mysql_thread_Id waiting_thread,        r.trx_query waiting_que ...

  4. 提高Linux上socket性能

    在 开发 socket 应用程序时,首要任务通常是确保可靠性并满足一些特定的需求.利用本文中给出的 4 个提示,您就可以从头开始为实现最佳性能来设计并开发 socket 程序.本文内容包括对于 Soc ...

  5. nodejs是单线程

    你不妨先思考一个问题:在单核时代,PHP之类多线程或者多进程的,是怎么处理并发的?是排队吗? 答案是:的确就是排队.但是并不是一定要处理完请求1才能去处理请求2:实际上请求的处理过程中,有很多的时间是 ...

  6. win2008修改最大远程桌面连接数

    win2008修改最大远程桌面连接数 运行——gredit.msc——管理模板——windows组件——远程桌面服务——远程桌面回话主机——连接——限制连接的数量——修改为999999

  7. (Android学习系列)三,窗口的常用事件

    设置窗口标题事件和在Activity之间跳转 新建一个项目,新建两个Activity:MainActivity,TitleActivity ,然后再AnroidManifest.xml 中注册Titl ...

  8. thinkphp对数据库操作有哪些内置函数

    getModelName() 获取当前Model的名称 getTableName() 获取当前Model的数据表名称 switchModel(type,vars=array()) 动态切换模型 tab ...

  9. java 词法分析器

    参考:http://www.cnblogs.com/yanlingyin/archive/2012/04/17/2451717.html 实现了一个简单的java词法分析器 功能:词法分析下面一段ja ...

  10. [搜片神器]使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)

    谢谢园子朋友的支持,已经找到个VPS进行测试,国外的服务器:http://www.sosobta.com   大家可以给提点意见... 出售商业网站代码,万元起,非诚勿扰,谢谢. 联系h31h31 a ...