读取lnk文件的一般方法

时间:2010-08-06 16:57:25

标签: language-agnostic shortcut lnk

几个框架和语言似乎都有lnk文件解析器(C#,Java,Python,当然无数其他),以获取他们的目标,属性等。我想知道读取lnk文件的一般方法是什么,如果我想用另一种没有上述功能的语言解析lnk。是否有适用于此的Windows API?

6 个答案:

答案 0 :(得分:3)

没有来自Microsoft的官方文档描述lnk文件格式,但有一些文档描述了该格式。以下是其中之一:Shortcut File Format (.lnk)

对于API,您可以使用IShellLink Interface

答案 1 :(得分:2)

This is an old post, but here is my C# implementation for lnk processing that handles the entire spec

https://github.com/EricZimmerman/Lnk

more info and command line tool here

http://binaryforay.blogspot.com/2016/02/introducing-lecmd.html

答案 2 :(得分:1)

只需在 J.A.F.A.T使用lnk文件解析器。法医分析工具项目存档

请参阅http://jafat.sourceforge.net

上的lnk-parse-1.0.pl

似乎没有依赖关系。语法很简单,链接文件在标准输出中变成简单文本,可以在Linux上使用。

答案 3 :(得分:0)

@Giorgi:实际上, 是lnk文件的官方规范,至少声称如此: http://msdn.microsoft.com/en-us/library/dd871305%28PROT.10%29.aspx 但是,出于某种原因,链接似乎已经死了,在下载整个(45Megs)doc包(Application_Services_and_NET_Framework.zip)之后,它似乎不包含文件MS-SHLLINK.pdf。

但这真的令人惊讶吗?

一旦你获得了文件格式,编写代码就不会太难读。

答案 4 :(得分:0)

使用 与WSH相关的组件 似乎是在XP后Windows系统上以大多数语言阅读.lnk文件的最方便选项。您只需要访问COM环境并实例化WScript.Shell组件。 (请记住,在win上,对 Shell 的引用通常是指explorer.exe

以下代码段,例如在PHP上做的事情:(PHP 5,使用COM对象)

<?php
$wsh=new COM('WScript.Shell'); // the wsh object

// please note $wsh->CreateShortcut method actually
// DOES THE READING, if the file already exists. 
$lnk=$wsh->CreateShortcut('./Shortcut.lnk');
echo $lnk->TargetPath,"\n";

相反,另一个在VBScript上也是如此:

set sh = WScript.CreateObject("WScript.Shell")
set lnk = sh.CreateShortcut("./Shortcut.lnk")
MsgBox lnk.TargetPath

该领域的大多数示例都是用VB / VBS编写,但它们在支持COM和WSH交互的各种语言中都能很好地翻译

This simple tutorial可能会派上用场,因为它列出并举例说明了.lnk文件中除最重要文件之外的一些最有趣的属性:TargetPath。那些是:

  • WindowStyle
  • Hotkey
  • IconLocation
  • Description
  • WorkingDirectory

答案 5 :(得分:0)

这里有一些使用 Shell32 API 的 C# 代码,来自我位于 https://github.com/jmaton/ClearRecentLinks 的“ClearRecentLinks”项目

要使用它,您的 C# 项目必须引用 c:\windows\system32\shell32.dll

            string linksPath = "c:\some\folder";
            Type shell32Type = Type.GetTypeFromProgID("Shell.Application");
            Object shell = Activator.CreateInstance(shell32Type);
            Shell32.Folder s32Folder = (Shell32.Folder)shell32Type.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { linksPath });
            foreach (Shell32.FolderItem2 item in s32Folder.Items())
            {
                if (item.IsLink)
                {
                    var link = (Shell32.ShellLinkObject)item.GetLink;
                    if (link != null && !String.IsNullOrEmpty(link.Target.Path))
                    {
                        string linkTarget = link.Target.Path.ToLower();
                        // do something... 
                    }
                }
            }