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
おお、ちゃんと取得できた。ここまでわかれば、あとはどうとでもなりますね。