いくつかのフレームワークと言語には、ターゲットやプロパティなどに到達するために、lnkファイルパーサー(C#、Java、Python、確かに無数の他のもの)があるようです。上記の機能を持たない別の言語でlnkを解析したい。このためのWindowsAPIはありますか?
6 に答える
lnkファイル形式を説明するMicrosoftの公式ドキュメントはありませんが、フォーマットの説明があるドキュメントがいくつかあります。そのうちの1つを次に示します。ショートカットファイル形式(.lnk)
APIに関しては、 IShellLinkインターフェイスを使用できます
これは古い投稿ですが、仕様全体を処理するlnk処理のC#実装は次のとおりです
https://github.com/EricZimmerman/Lnk
詳細とコマンドラインツールはこちら
http://binaryforay.blogspot.com/2016/02/introducing-lecmd.html
JAFAT Archive of ForensicsAnalysisToolsプロジェクトでlnkファイルパーサーを使用するだけです。
http://jafat.sourceforge.netでlnk-parse-1.0.plを参照してください。
依存関係はないようです。構文は単純で、リンクファイルは標準出力で単純なテキストになり、Linuxで使用できるようになります。
WSH関連のコンポーネントを使用すること.lnk
は、XP以降のWindowsシステムでほとんどの言語のファイルを読み取るための最も便利なオプションのようです。COM環境にアクセスして、WScript.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の相互作用を何らかの形でサポートするすべての言語でうまく翻訳されます。
この簡単なチュートリアル.lnk
は、最も重要なもの以外のファイルの最も興味深いプロパティのいくつかをリストして例示しているので、便利な場合がありTargetPath
。それらは:
WindowStyle
、Hotkey
、IconLocation
、Description
、WorkingDirectory
@Giorgi:実際には、lnkファイルの公式仕様があります。少なくとも次のように主張されています 。http: //msdn.microsoft.com/en-us/library/dd871305%28PROT.10%29.aspx ただし、一部のファイルについては理由は、リンクが無効になっているようで、(45Megs)ドキュメントパッケージ全体(Application_Services_and_NET_Framework.zip)をダウンロードした後、ファイルMS-SHLLINK.pdfが含まれていないようです。
しかし、これは本当に驚くべきことですか?
ファイル形式を取得したら、それを読み取るためのコードを書くのはそれほど難しくないはずです。
https://github.com/jmaton/ClearRecentLinksにある私の「ClearRecentLinks」プロジェクトからのShell32APIを使用したC#コードを次に示します。
これを使用するには、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...
}
}
}