需求
在 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 下运行就直接自己解析快捷方式了……