VBS Call Windows API

VBSからAPI関数を呼び出す方法として、別途作成したDLL経由で呼び出す方法や”SFC mini“、”DynaCall“といったツールを使う方法がありますが、わりとよく使われるのが『Excel経由でCALL関数を使って呼び出す』方法です。

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の説明ページを見てみると、下記のような記述があります。
http://office.microsoft.com/ja-jp/excel-help/HP010343000.aspx?CTT=5&origin=HP010342224

“タイプ” の先頭の文字では、戻り値のデータ型を指定します。残りの文字では、すべての引数のデータ型を指定します。たとえば、戻り値が浮動小数点数、引数が整数と浮動小数点数である DLL 関数は、”タイプ” 引数として “BIB” を取ります。

この「JJJJJ」というのは戻り値と引数のデータ型を文字列で表しているわけです。

そこで、改めて上記コードが一体どのような処理を行っているのかというと、

1. メモ帳を起動します。
2. FindWindowでメモ帳のウィンドウハンドルを取得します。
3. 2.で取得したハンドルを元にウィンドウに対してSendMessageでWM_COMMAND(&H111(273))、wParam:&H41(65)を送り、メモ帳のバージョン情報を表示します。

といった処理を行っているわけです。

上記のようなVBSからAPI関数を呼び出す処理は、ウィンドウズスクリプトプログラマさんのブログ「Windows Script Programming」にて多数紹介されていますので、興味がある方は参考にされてはいかがでしょうか。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值