WA_MACROを使ってみる ACT-2

関数を呼び出す別の方法

WA_MACROでは、 kernel32.as や gdi32.as など、あるいは winapi.as をインクルードすれば、それぞれのファイルでマクロ定義されたWin32 API関数を呼び出すことができます。

一方で、llmodモジュールの dllproc 命令のように、DLLのハンドルと関数名から関数を呼び出すための機能も提供しています。呼び出しマクロ提供されていないDLLの関数を呼び出すには、新しくマクロを定義してそれを使用するか、もしくは以下の方法で呼び出す必要があります。

CallDllProc name, hDll, p1, p2, …
name : 関数名
hDll : DLLのハンドル
p1, p2, 〜 : 関数の引数

name パラメータには呼び出す関数の名前を、 hDll パラメータにはその関数を含んでいるDLLのハンドルを指定します。 p1 以降は関数の引数を指定するもので、 PTR(...)PRMHWND などの引数用マクロを使用することができます。

このマクロ命令 CallDllProc で関数を呼び出す場合には、あらかじめDLLのハンドルを取得しておく必要があります。DLLのハンドルの取得は ll_libload 命令を使用します。もちろん、直接 LoadLibrary 関数を呼び出して取得することもできます。

以下は、 MessageBeep 関数を呼び出す例です。

#include "wam/user32.as"
#define MB_ICONHAND     $00000010

; 定義済みマクロを使用
MessageBeep MB_ICONHAND
wait 50
; CALLDLLPROC を使用 (user32.as の定義済みDLLハンドル使用)
CallDllProc "MessageBeep", hDll_USER32, MB_ICONHAND
wait 50
; CALLDLLPROC を使用 (DLLハンドルを取得して使用)
ll_libload hdll, "user32.dll"
CallDllProc "MessageBeep", hdll, MB_ICONHAND
ll_libfree hdll

また、すでに関数のアドレス(関数へのポインタ)を取得している場合には、その関数の呼び出すのに CallProc マクロ命令を使用することができます。

CallProc pFunc, p1, p2, …
pFunc : 関数のアドレス
p1, p2, 〜 : 関数の引数

機能としては ll_callfunc 命令と同じですが、 CallProc の場合には PTR(...)PRMHWND などといった引数用マクロが使用できるという利点があります。

これらのマクロは、いずれも wa_ini.as ファイル内で定義されており、このファイルをインクルードする必要があるのですが、user32.as や kernel32.as などWA_MACROが提供するいずれかのファイルをインクルードすれば自動的に wa_ini.as がインクルードされるようになっています。

Win32 APIの定義済み定数を取得する

Win32 APIで使用される定義済み定数、(例えば、上の例では $00000010 に定義されている MB_ICONHAND など)を知るには、Visual C++やPlatform SDKなどに含まれているヘッダファイルを参照したり、あるいはWeb上で調べたりと、いろいろ面倒なことをする必要がありました。

WA_MACROには、このような定義済み定数を教えてくれる、『search.exe』という便利なツールが同梱されています。これはWA_MACROを解凍した時の「omake」フォルダの中にあります。

例えば、先ほどの MB_ICONHAND を調べるには、テキストボックスに「MB_ICONHAND」と入力し、コンボボックスで「完全一致」を選択して「検索」ボタンを押す(またはEnterキーを押す)と、 MB_ICONHAND の値の定義が下のテキストボックスに表示されます。すでに #define で定義された形式になっているので、このままコピーしてスクリプトに貼り付けることができます。

また、例えば「MB_」と入力して、コンボボックスで「前方一致」を選択すれば、「MB_」から始まる定数名の定義を取得できますし、「部分一致」を選択すれば、定数名に「MB_」を含むような定数の定義を取得することができます。非常に便利なものなので、活用してみましょう。