browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

获取特殊快捷方式的指向路径

Posted by on 2011 年 08 月 05 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

在通常的情况下,为了获取一个快捷方式 (.lnk) 指向的路径,可以通过调用 IShellLink 接口的 GetPath 方法来实现。但是,某些特殊的快捷方式是无法取得指向路径的,比如 Office 系列的快捷方式,如下图。

首先你可以看到,普通快捷方式中用于显示路径信息的“目标”一栏已经被禁用掉了。而且,对其调用 IShellLink::GetPath,会得到类似这样的结果:

C:\Windows\Installer\{90120000-0012-0000-0000-0000000FF1CE}\wordicon.exe

我的直觉告诉我,问题的真正答案就藏在 IShellLink 之中。不过,那正确的路是哪一条呢?MSDN 的优点是完备,缺点则是过于完备,我已经数次被淹没其中了。故不取之。

那么还是自己分析吧。我打开 Process Monitor,设置过滤器,如下图。

接下来使用快捷方式来启动 Word,可以看到系统的确访问了 wordicon.exe。

继续往下找,找到 WINWORD.EXE 的第一个现身处。

查看其调用堆栈,如下所示。

从堆栈中,可以得到两个有用的信息:

  1. WINWORD.EXE 真实路径的获取与 CShellLink::_Resolve 有关。而 IShellLink 之中,也存在一个名为 Resolve 的接口。
  2. WINWORD.EXE 真实路径的获取借助了 msi.dll (Microsoft Windows Installer) 的部分函数,而 IShellLink::Resolve 方法的 fFlags 参数恰有一个标志名为 SLR_INVOKE_MSI。

好了,现在已经猜出了那句最重要的代码,可以堆码一试了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CComPtr<IShellLink> sl;
sl.CoCreateInstance(CLSID_ShellLink);
 
// Load the link file...
 
TCHAR sz[MAX_PATH];
WIN32_FIND_DATA wfd;
sl->Resolve(NULL, SLR_INVOKE_MSI);
 
// C:\Windows\Installer\{90120000-0012-0000-0000-0000000FF1CE}\wordicon.exe
sl->GetPath(sz, MAX_PATH, &wfd, SLGP_RAWPATH);
 
// D:\Program Files\Microsoft Office\Office12\WINWORD.EXE
LPITEMIDLIST pidl = NULL;
sl->GetIDList(&pidl);
SHGetPathFromIDList(pidl, sz);

订阅本站

5 Comments

  • At 2011.08.05 18:38, lonkil said:

    Process Monitor已被楼主用的出神入化。

    • At 2011.08.19 00:59, Магсн said:

      微软为什么要设计成这样?有什么优缺点?

      • At 2011.08.19 09:12, 李马 said:

        恐怕只有他们自己知道。

        • […] 然后我换种方式 获取该快捷方式路径参数-获取不到IE快捷方式路径,是空白的。获取Office会显示错误路径(C:WindowsInstaller{90120000-0012-0000-0000-0000000FF1CE}wordicon.exe 这个是无法打开的) 相关分析(我试了似乎还是无法获取正确路径,不知道是不是方式不对):http://blog.titilima.com/get-path-from-special-shortcuts.html […]

          • At 2015.03.04 16:13, magicdmer said:

            感谢作者。。

            (Required)
            (Required, will not be published)