lnkファイルのリンク先を取得する


lnkファイルを作成するのはWSHを使えば簡単にできます。たとえば次のコードは、テスクトップに「メモ帳(notepad.exe)」へのショートカットを「メモ帳.lnk」という名前で作成します。

Sub Sample1()
    Dim WSH, LnkFile, DeskTopPath As String, LnkFileName As String
    Set WSH = CreateObject("WScript.Shell")
    DeskTopPath = WSH.SpecialFolders("Desktop")
    LnkFileName = DeskTopPath & "\メモ帳.lnk"
    Set LnkFile = WSH.CreateShortcut(LnkFileName)
    LnkFile.TargetPath = "%SystemRoot%\System32\notepad.exe"
    LnkFile.Save
    Set LnkFile = Nothing
    Set WSH = Nothing
End Sub

デスクトップのパスを取得するのにSpecialFoldersメソッドを使っていますが、それ以外は特に難しくありません。もっとも私は、今までショートカットを作成する必要がなかったので、実際にプログラムしたことはありませんでした(一回くらいはあったかな)。

今回やりたかったのは、新しくショートカットを作成するのではなくすでに存在するlnkファイルのリンク先を調べたかったんです。リンク先のexeファイルなどをうっかり移動してしまうと、lnkファイルが機能しなくなります。そうしたリンク切れのlnkファイルがどれくらいあるか、あるいは、このexeファイルを移動したいんだけど、リンクしているlnkファイルがないだろうか…なんてことを調べたかったんです。

lnkファイルのリンク先を取得するにはどうしたらいいか。WSHはショートカットの作成だろ。何か専用のAPIがあるのかな。それともlnkファイルのフォーマットを調べた方がいいのかな。な~んてことを考えながらWSHのドキュメントを読んでいたら次のように書かれていました。

CreateShortcut メソッド

ショートカットまたは URL ショートカットへのオブジェクト参照を作成します。

object.CreateShortcut(strPathname)

解説

CreateShortcut メソッドは、WshShortcut オブジェクトまたは WshURLShortcut オブジェクトのいずれかを返します。

lnkファイルを作るときはWSHのCreateShortcutメソッドを使いますが、このCreateShortcutメソッドは「WshShortcutオブジェクトを返す」と。てことは、WshShortcutオブジェクトに既存のlnkファイルを入れてやればTargetPathプロパティを取得できるんじゃないか。

Sub Sample2()
    Dim WSH, LnkFile, DeskTopPath As String, LnkFileName As String
    Set WSH = CreateObject("WScript.Shell")
    DeskTopPath = WSH.SpecialFolders("Desktop")
    LnkFileName = DeskTopPath & "\メモ帳.lnk"
    Set LnkFile = WSH.CreateShortcut(LnkFileName)
    MsgBox LnkFile.TargetPath
    Set LnkFile = Nothing
    Set WSH = Nothing
End Sub

おお、ちゃんと取得できた。ここまでわかれば、あとはどうとでもなりますね。