VBSからAPI関数を呼び出す方法として、別途作成したDLL経由で呼び出す方法や”SFC mini“、”DynaCall“といったツールを使う方法がありますが、わりとよく使われるのが『Excel経由でCALL関数を使って呼び出す』方法です。
1 2 3 4 5 6 7 8 | Dim h CreateObject( "WScript.Shell" ).Run "notepad" , 1, False With CreateObject( "Excel.Application" ) h = .ExecuteExcel4Macro( "CALL(" "user32" ", " "FindWindowA" ", " "JCJ" ", " "Notepad" ", 0)" ) If h = 0 Then WScript.Quit Call .ExecuteExcel4Macro( "CALL(" "user32" ", " "SendMessageA" ", " "JJJJJ" ", " & h & ", 273, 65, 0)" ) End With |
上記コードを見るとExecuteExcel4MacroメソッドでExcel4.0マクロ関数を実行しているようですが、ここで使われているのが実は「CALL」関数です。この関数の引数でAPI関数名やDLL名を指定しているわけです。
CALL(モジュール名, プロシージャ名, タイプ, [引数 1], …, [引数 n])
「CALL 関数」より
第一引数でモジュール名、第二引数で関数名、これはすぐ分かると思いますが、問題なのが第三引数。上記コードを見ると「JJJJJ」となっていて、これが一体何を表しているのかよく分からない人も多いだろうと思います。
そこでMicrosoftの説明ページを見てみると、下記のような記述があります。
“タイプ” の先頭の文字では、戻り値のデータ型を指定します。残りの文字では、すべての引数のデータ型を指定します。たとえば、戻り値が浮動小数点数、引数が整数と浮動小数点数である DLL 関数は、”タイプ” 引数として “BIB” を取ります。
この「JJJJJ」というのは戻り値と引数のデータ型を文字列で表しているわけです。
そこで、改めて上記コードが一体どのような処理を行っているのかというと、
1. メモ帳を起動します。
2. FindWindowでメモ帳のウィンドウハンドルを取得します。
3. 2.で取得したハンドルを元にウィンドウに対してSendMessageでWM_COMMAND(&H111(273))、wParam:&H41(65)を送り、メモ帳のバージョン情報を表示します。
といった処理を行っているわけです。
上記のようなVBSからAPI関数を呼び出す処理は、ウィンドウズスクリプトプログラマさんのブログ「Windows Script Programming」にて多数紹介されていますので、興味がある方は参考にされてはいかがでしょうか。
コメントを残す