以前にRiffRaffさんが開発されていた Lollipop2 のアーカイブには IID Explorer というツールが同梱されています。これは、レジストリやヘッダファイルから COM インターフェースの情報を検索し、インターフェース ID やメソッドのインデックスに関しての情報をクリップボードにコピーしてくれます。 VC++ などのヘッダファイルを持たない環境では目的のインターフェースの情報を取得できないことも多いですが、ヘッダファイルがあれば COM インターフェースの使用がかなり楽になります。
現在の Lollipop3 には IID Explorer が含まれていないので、まずRiffRaffさんのページから以前のバージョンのLollipop(2.00β3)をダウンロードし、その中の utility フォルダに含まれている IID Explorer をコピーして、使えるようにしておきましょう。
ヘッダファイルがない環境では、特にメソッドインデックスの情報などの取得があまり期待できないので、ここではヘッダファイルを持っている環境を前提として進めます。
IID Explorer を起動すると、初回起動の場合は、フォルダ選択ダイアログが表示されます。VC++ などの開発言語がインストールされている場合は、そのヘッダファイルが含まれているフォルダを選択します。(通常は 「 Include 」フォルダ)
すると、レジストリのスキャン、ヘッダファイルのスキャンが行なわれて、さまざまなインターフェースの情報がリスト化されます。これが終わると、情報の取得が可能になります。(2回目以降の起動時は、初回の設定が反映されるので、すぐに使用可能になります。)
では、ためしに IShellLinkA インターフェースの IID を取得してみましょう。
IID Explorer のダイアログの「Interface Name」欄に、“IID_IShellLinkA”または“IShellLinkA”と入力してから、「 Search 」ボタンまたはリターンキーを押します。インターフェース名の最初の“IID_”は記述してもしなくてもかまいません。
すると、リストボックス内に“IShellLinkA”と表示されるので、これが選択されている状態で「 Copy 」ボタンを押します。すると、インターフェース ID の情報が以下のような形でクリップボードにコピーされます。これをエディタ上で貼り付けます。
#define IID_IShellLinkA "{000214EE-0000-0000-C000-000000000046}"
次に、メソッドのインデックスの情報を取得します。リストボックス内の“IShellLinkA”が選択されている状態で、「 Method 」ボタンを押すと、メソッド名がリストボックスに表示されます。この状態で「 Copy 」ボタンを押すと、メソッドインデックスの情報が以下のような形でクリップボードにコピーされます。これをエディタ上で貼り付けます。
; IShellLinkA Methods in VTable Order
#define IShellLinkA_QueryInterface 0
#define IShellLinkA_AddRef 1
#define IShellLinkA_Release 2
#define IShellLinkA_GetPath 3
#define IShellLinkA_GetIDList 4
#define IShellLinkA_SetIDList 5
#define IShellLinkA_GetDescription 6
#define IShellLinkA_SetDescription 7
#define IShellLinkA_GetWorkingDirectory 8
#define IShellLinkA_SetWorkingDirectory 9
#define IShellLinkA_GetArguments 10
#define IShellLinkA_SetArguments 11
#define IShellLinkA_GetHotkey 12
#define IShellLinkA_SetHotkey 13
#define IShellLinkA_GetShowCmd 14
#define IShellLinkA_SetShowCmd 15
#define IShellLinkA_GetIconLocation 16
#define IShellLinkA_SetIconLocation 17
#define IShellLinkA_SetRelativePath 18
#define IShellLinkA_Resolve 19
#define IShellLinkA_SetPath 20
これをスクリプト中に記述することによって、これらの定義値を使用することができます。例えば、icall 命令によって IShellLink::SetPath メソッドの呼び出しをする場合には、以下のように記述できます。
; IShellLink::SetPath メソッド呼び出し getptr pm, targetfile ; ファイル名文字列のアドレス icall pShellLink, IShellLinkA_SetPath, pm, 1