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