解析 Windows 快捷方式的经验

需求

在 Windows 平台,解析快捷方式(.lnk 文件),获得它指向的目标路径。

分析

有以下相关 API 可以使用:

  • IShellLink 对象
  • MsiGetShortcutTarget

实践

首先,当然是 MSDN 一下 IShellLink 这个 COM 接口,照着写一下,然后测试。郁闷的事情开始了!IShellLink 对象无法正确解析 MSI 创建的新型快捷方式。

所以要用 MsiGetShortcutTarget + MsiGetComponentPath 先尝试获得,失败了才用 IShellLink。

继续测试大量快捷方式后,发现另一个问题:当自己是 x86 程序时,读取的快捷方式如果指向的是 Program Files 下的任何文件或者文件夹,都会被强制解析为 Program Files (x86),好智能啊!!

搜一下,发现使用 IShellLink 对象的前提下,无法解决这个问题。无数老外都郁闷!

于是开始逆向,发现是 IDL 被读出来时就已经做了转换,所以用 IShellLink::GetIDList + SHGetPathFromIDList 也是浪费力气。

最后无奈了,如果发现自己在 WOW64 下运行就直接自己解析快捷方式了……

参考

  1. 【已失效】http://www.vckbase.com/index.php/wv/1132
  2. https://www.codeproject.com/Articles/24001/Workaround-for-IShellLink-GetPath
  3. 【已失效】http://biancheng.dnbcw.info/1000wen/447642.html
如果您使用微信,也可以关注公众号 UMU618,在公众号文章里评论。