aodama.gif(0.97KB) VB でショートカット作成(β版)

 ショートカットを作成する方法自体はすでに色々なサイトで公開されておりますので、 あえて詳細な使用方法は記述しません。 「私がショートカット作成に成功するまでの長い道のり」といった形式で書いておきます(^^;


● fCreateShellLink はまともに使えない!

 VB でショートカットを作成するというのは、私にとっては長年の課題でした(笑)。 1998年、私は「ClipPath」という、ファイルのフルパスをクリップボードに格納するという機能を持つソフトを開発していました。 しかしそれだけではあまりにも芸が無さ過ぎるため、 「送る」メニューにショートカットを作成する機能をつけてみたいなと思ったのです。

 しかし VB にはショートカットを作成する関数などは当然ありません。 当時購入した Win32 API の分厚い本をくまなく探しても、 ショートカットを作成する API は見つかりませんでした。 う〜ん、方法は必ずあるはずなのに・・・

 途方にくれていたところ、 VB初心者友の会「VB4 のランタイム stkit432.dll の fCreateShellLink() でショートカットを作成できる」という情報を得ることができました。 おお〜!これでやっと実現!さっそく「ClipPath」に fCreateShellLink() を盛り込み、 ショートカット作成は実現したのでした。

 ところが「ClipPath」公開から数ヶ月後、 「ショートカット自動作成機能を使うと "ランタイムエラー 48" が出てしまう」というメールを数件いただきました。 えっ、そ、そんなはずは・・・メールでその方々から色々伺ったところ、 どうやら stkit432.dll がインストールされていなかったようです。 他にも stkit432.dll が存在しない環境の人が多数いるのかもしれない・・・これでは fCreateShellLink() は安心して使えないや(泣)。 その後 VB5 にコンパイラを変更し、結局 Vb5stkit.dll をアーカイブに同梱するという苦肉の策を用いたのでした(^^;

 いちおう参考までに fCreateShellLink() の仕様を書いておきます。 VB5 をお使いの方は、"STKIT432.DLL" を "Vb5stkit.dll" に書き換えて下さい。 VB6 は使ったことがないのでわかりません(^^;

fCreateShellLink - ショートカットを作成する
宣言文
Declare Function fCreateShellLink Lib "STKIT432.DLL" _
    (ByVal lpstrFolderName As String, _
     ByVal lpstrLinkName As String, _
     ByVal lpstrLinkPath As String, _
     ByVal lpstrLinkArguments As String) As Long
返値
関数の仕様書がどこにも存在しない(?)ためはっきりしたことはわかりませんが、 たぶん成功したら TRUE 値(0 以外の値)で、失敗したら 0 なんじゃないでしょうか?(^^;
引数説明
lpstrFolderName ショートカットファイルを作成するディレクトリを、 "プログラム" ディレクトリ("\Windows\スタート メニュー\プログラム")から見た相対パスで指定します。絶対パスの指定は不可。 "デスクトップ" ディレクトリを指定する場合通常なら "..\..\デスクトップ" となります。 これがこの関数の嫌なところですね。"プログラム" ディレクトリの絶対パスは Win9x と Win2k/XP とでは異なりますし、 ユーザーが変更していることも考えられます。 「特殊フォルダのパスを取得する」に記述されているような方法を用いて、 "プログラム" ディレクトリの位置を取得し、作成されたショートカットファイルを好きな場所に移動するなどの処理を行う必要があります。
lpstrLinkName ショートカットファイルの名前を指定します。拡張子 lnk は不要です。
lpstrLinkPath ショートカットの「リンク先」を指定します。
lpstrLinkArguments ショートカットのコマンドライン引数を指定します。


● SHAddToRecentDocs

 ショートカットを作成するだけならもっといい方法はないのか?と探していたところ、 ゆー太郎さんが「空耳工房 MY2Project HomePage」において SHAddToRecentDocs() という API を用い、 「最近使ったファイル」ディレクトリ("\Windows\Recent")にショートカットを作成する方法を公開されておられるのを発見。 おおっ、これなら stkit432.dll を添付する必要もないぞ!「特殊フォルダのパスを取得する」のような方法を用いて Recent ディレクトリを取得し、 作成されたショートカットを任意の位置にコピーすれば完璧!

 しかし一つ注意すべき問題があります。Recent ディレクトリに作成されるショートカットファイル名が不定なのです。 通常は "Clippath.exe" のショートカットは "Clippath.lnk" になるのですが、 エクスプローラのオプション設定が「常に拡張子を表示」になっていた場合は "Clippath.exe.lnk" になってしまうのです。 また、すでに同名のショートカットが Recent ディレクトリに存在していた場合、 "Clippath.exe (1).lnk", "Clippath.exe (2).lnk" のようにインデックスがファイル名に付けられてしまいます。 また、レジストリをいじって「最近使ったファイル」の履歴が記録されないように設定している人の環境だと、 ひょっとしたら作成されないかも知れません(未確認)。 実際に使用する場合は注意して下さい。

空耳工房 MY2Project HomePage : http://hello.to/my2project/


● IShellLink が使えない!

 その後、さるべーじさんが「猿頁」において、 IShellLink インターフェースを VB から使用する方法を紹介しておられるのを知りました。 ショートカットの作成のみならず、「リンク先」「作業フォルダ」などの細かい情報の設定・取得も可能です。

 これは使える!と思ってさっそく CD-ROM の中を見てみたら、 SHELLLNK.TLB や MKTYPLIB.EXE が CD-ROM に入っていない!そう、私の VB5 は Leaning Edition だったのです(号泣)。 自分で ODL を記述するスキルなんてないし、もし記述できたとしても MKTYPLIB.EXE がないんじゃあどうしようもありません。 結局 IShellLink もあきらめ、また数年の月日が流れることになったのです。

 さるべーじさんが紹介しておられる方法は Professional Edition 以上のグレードの VB なら関連ファイルが CD-ROM 内にあるため、 Professional Edition 以上のグレードの VB を持ってる人なら誰でもすぐに使えます。 コンパイルしてしまえば特に添付すべきファイルもありません。 この方法が現時点では一番良い方法だと思われます。 Leaning Edition ユーザーは使えませんが・・・

猿頁 : http://member.nifty.ne.jp/salv/


● WSH ではちょっと・・・

 Windows Script Host の CreateShortcut メソッドなどを使用してショートカットを作成する方法もあります。 ショートカット情報の細かい設定も可能です。

 しかし Windows 95 ユーザーなど、WSH が使用できない環境の人も多数存在します。 私のように WSH をインストールしている Win95 ユーザーなら使用できますが、 「Win95 の場合は WSH をインストールしないと使用できません」って Readme.txt に書くのもダサいし(笑)、却下。 どうせならすべての Win32 OS で使用できる方法を用いたいんだけど・・・

 作成するだけのサンプルが書けたので載せときます。俺は WSH 超初心者なのでかなりぁゃιぃよ(^^;

Shortcut.bas の内容 : shortcut.htm
サンプル : ダウンロード shortcut.lzh (4.13KB)


● VC++ で DLL 作成 → やっと成功

 2000年、C言語の学習をするために Microsoft Visual C++ 6.0 を購入しました。 単機能ソフトくらいはこれで作ってしまおうか?と思ってたのですが、 GUI を作るのには非常に高度な知識と技術を要することを知り、挫折(^^;

 しかし VC++ は、VB から呼び出すことができる DLL を作成することができるのです。 そこで思いついたのが、「IShellLink インターフェースを使用してショートカットを作成する DLL を作って、 それを VB から呼び出したらどうだろ?」ということでした。 幸い IShellLink を使用するサンプルは Google したらたくさん見つかりました(笑)。 完成し実行してみたら見事に成功!長年の夢がついに実現したのでした。 まあ DLL を同梱しないと使えないけどね(^-^;

 とりあえず私が作成した DLL と宣言モジュールをアップしておきますのでご自由にお使い下さい。 DLL を添付しての再配布もOKです。 ただし VB からの使用のみを前提としたベータ版ですので、Shlink.h と Shlink.lib は入っていません(^^;

Option Explicit

'===== SHLINK.DLL Declaration Module for VB32 Ver 1.01 Beta =====
'(C)2000-2001 けるべ
'MAIL : NULL
'HOME : http://www.geocities.co.jp/SilkRoad/4511/
'
'このモジュールは、ショートカットの作成・情報取得ができる、拙作の
'SHLINK.DLL を、Microsoft Visual Basic 32bit から使用するための
'宣言モジュールです。SHLINK.DLL Ver 1.01 で使用できます。
'
'このモジュールは SHLINK.DLL と同様に再配布可能ですが、
'現時点ではベータ版ですので、今後大幅な仕様変更などが行われる
'可能性がありますので、注意してご使用下さい。
'
'なおこのモジュール及び SHLINK.DLL を使用したことによって発生した
'障害・損害などの不利益につきましては、当方は一切の責任を
'負いかねますのでご了承下さい。

'----- Win32 API 定数 -----
Public Const NOERROR = 0&           '成功
Public Const MAX_PATH = 260         'パス長
Public Const SLGP_SHORTPATH = &H1   'ショートパスで
Public Const SLGP_UNCPRIORITY = &H2 'UNC パスで
Public Const SLGP_RAWPATH = &H4     '?

'----- ShellLinkStatus 構造体 -----
'ショートカット情報を格納する構造体です。
'
'cPath
'   ショートカットの「リンク先」情報を格納します。
'   VB で SetShellLinkStatus() を用いて情報を引き渡す場合、
'   文字列の終端に NULL 文字(vbNullChar)を付加して下さい。
'
'cArguments
'   ショートカットの「コマンドライン引数」情報を格納します。
'   VB で SetShellLinkStatus() を用いて情報を引き渡す場合、
'   文字列の終端に NULL 文字(vbNullChar)を付加して下さい。
'
'cWorkingDirectory
'   ショートカットの「作業フォルダ」情報を格納します。
'   VB で SetShellLinkStatus() を用いて情報を引き渡す場合、
'   文字列の終端に NULL 文字(vbNullChar)を付加して下さい。
'
'cIconPath
'   ショートカットのアイコンのパスを格納します。
'   VB で SetShellLinkStatus() を用いて情報を引き渡す場合、
'   文字列の終端に NULL 文字(vbNullChar)を付加して下さい。
'
'iIconIndex
'   ショートカットのアイコンのインデックスを格納します。
'
'wHotKey
'   ショートカットの「ショートカット キー」情報を
'   仮想キーコードとして格納します。
'
'iShowCmd
'   ショートカットの「実行時の大きさ」情報を格納します。
'   ShowWindow() の定数を参考にして下さい。
'
Public Type ShellLinkStatus
    cPath As String * MAX_PATH
    cArguments As String * MAX_PATH
    cWorkingDirectory As String * MAX_PATH
    cIconPath As String * MAX_PATH
    iIconIndex As Long
    wHotkey As Integer
    iShowCmd As Long
End Type

'----- SetShellLinkStatus -----
'ショートカットを作成します。
'
'引数 lpShellLinkPath
'   ショートカットファイルの保存先のパスが含まれた
'   文字列へのポインタを指定します。
'
'引数 pShellLinkStatus
'   ショートカットの情報が含まれた ShellLinkStatus 構造体への
'   ポインタを指定します。
'
'戻り値
'   成功時には NOERROR を返します。
'   何らかのエラーが発生した場合は 1 以上の数値を返します。
'   詳しくは下記エラーコードを参考にして下さい。
'
'注意していただきたいのは、文字列を引き渡す場合には、
'文字列の末尾に NULL 文字(vbNullChar)を付加する必要があると
'いうことです。C/C++ では文字列の末尾に NULL 文字を付加する
'ことにより、文字列の終端を表現するためです(C ストリング)。
'
'例 : slsRet.cPath = "A:\Windows\Notepad.exe" + vbNullChar
'
'なお、SHLINK.DLL の現バージョンでは、ショートカットの情報の
'一部だけを変更するといったようなことはできません。
'一部の情報のみを変更したい場合、GetShellLinkStatus() を用いて
'ShellLinkStatus 構造体に情報を格納した後、メンバの情報を書き換え、
'SetShellLinkStatus() で一括書き込みして下さい。
'
Public Declare Function SetShellLinkStatus Lib "Shlink.dll" _
    (ByVal lpShellLinkPath As String, _
     ByRef pShellLinkStatus As ShellLinkStatus) As Long

'----- CreateShellLink -----
'SetShellLinkStatus() と同じです。1.01 から関数名を変更したため、
'互換性のため一応残しておきました(^^;
'
Public Declare Function CreateShellLink Lib "Shlink.dll" Alias "SetShellLinkStatus" _
    (ByVal lpShellLinkPath As String, _
     ByRef pShellLinkStatus As ShellLinkStatus) As Long

'----- GetShellLinkStatus -----
'ショートカットファイルの各情報を取得します。
'
'引数 lpShellLinkPath
'   ショートカットファイルの保存先のパスが含まれた
'   文字列へのポインタを指定します。
'
'引数 pShellLinkStatus
'   ショートカットの情報を格納する ShellLinkStatus 構造体への
'   ポインタを指定します。
'
'引数 dwFlasgs
'   ショートカットのリンク先のパスの型式を表すフラグを指定します。
'
'   SLGP_SHORTPATH   : DOS8.3 のショートパスネームで格納します。
'   SLGP_UNCPRIORITY : UNC パスで格納します。
'
'戻り値
'   成功時には NOERROR を返します。
'   何らかのエラーが発生した場合は 1 以上の数値を返します。
'   詳しくは下記エラーコードを参考にして下さい。
'
'文字列は、文字列の終端に NULL 文字を付加した形で返されます。
'TrimNull 関数を使用すれば、NULL 文字が含まれない
'可変長文字列型変数に変換できます。
'
'例 : txtResult.Text = TrimNull(slsRet.cPath)
'
Public Declare Function GetShellLinkStatus Lib "Shlink.dll" _
    (ByVal lpShellLinkPath As String, _
     ByRef pShellLinkStatus As ShellLinkStatus, _
     ByVal dwFlags As Long) As Long

'----- SHLINK.DLL エラーコード -----
'1 〜 5 のエラーはショートカットを作成できない、
'または取得できないという致命的なエラーです(^^;
Public Const ERROR_COM_INIT = 1             'CoInitialize 失敗(現在未使用)
Public Const ERROR_COM_CREATEINSTANCE = 2   'CoCreateInstance 失敗
Public Const ERROR_COM_QUERYINTERFACE = 3   'QueryInterface 失敗
Public Const ERROR_COM_FILE = 4             'Save または Load 失敗
Public Const ERROR_CONVERTUNICODE = 5       'Unicode 変換失敗
'ショートカットの一部の情報を登録できない、
'または取得できない場合は 8 以上のエラーコードになります。
'これらのエラーが複数発生した場合、戻り値は合計値になります。
Public Const ERROR_PATH = 8                 'リンク先
Public Const ERROR_ARGUMENTS = 16           'コマンドライン引数
Public Const ERROR_WORKINGDIRECTORY = 32    '作業フォルダ
Public Const ERROR_DESCRIPTION = 64         'Description(現在未使用)
Public Const ERROR_ICONLOCATION = 128       'アイコンのパス
Public Const ERROR_HOTKEY = 256             'ショートカット キー
Public Const ERROR_SHOWCMD = 512            '実行時の大きさ

SHLINK.DLL for VB32 Package Ver 1.01 Beta : ダウンロード shlinkvb.lzh (21.6KB) ※ SHLINK.DLL も同梱されています


VBコーナーにもどる   トップページにもどる