HOME >> HSPサンプル置き場 兼 実験室 >> DLLを動的にロードしてみる

DLLを動的にロードしてみる
ここではHSPでDLLを動的にロードして、ツール類でよくある"プラグイン"っぽいことをやってみたいと思います。
とりあえず"プラグイン"として、足し算と引き算と掛け算を行う3種類のDLLを用意しました。
これらのDLLは"Calc"というおなじ名前、同じ引数の関数をもっていて、使用したDLLによって別々の処理結果が得られるようになっています。

今回はソースの再利用のことを考えて、DLLをロードしたり関数を呼び出したりする部分はモジュール化しました(CallFuncExt.as)。
以下のZIPファイルの中に今回の実験で使用したものが入っています。
モジュールの詳しいことは、アーカイブ内のテキストファイルを参照してください。
CallFuncExt.zip 12KB

とりあえず今回使用するDLLのソースコードです(これは足し算を行う"tasizan.dll"のものです)。

#include <windows.h>

BOOL WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, LPVOID lpvReserved)
{
    return TRUE;
}

int WINAPI Calc(int p1,int p2)
{
    return (p1+p2);
}

与えられた引数を処理して返すだけの簡単なものです。


次にHSPのソースコードです
#include "kernel32.as"
#include "callfuncext.as"

screen 0,300,200,0   :title "DLLを動的にロードしてみた"

// モジュールの初期化
InitCallFuncExt

// DLLをロード
LoadLib "tasizan.dll",0
LoadLib "hikizan.dll",1
LoadLib "kakezan.dll",2

// 引数を配列変数で指定
arg = 3,7

// DLL内の関数を実行
ExecFunc 0,"Calc",arg,2 :mes "足し算:"+arg(0)+"+"+arg(1)+"="+stat
ExecFunc 1,"Calc",arg,2 :mes "引き算:"+arg(0)+"-"+arg(1)+"="+stat
ExecFunc 2,"Calc",arg,2 :mes "掛け算:"+arg(0)+"*"+arg(1)+"="+stat

// ロードしたDLLを開放
ExitCallFuncExt

1行目で"kernel32.as"をインクルードしているのは、2行目の"callfuncext.as"の内部で必要になるからです。
サンプルの全体の流れは、初期化DLLロード引数を指定して関数を実行終了処理、といった感じです。

初期化は"InitCallFuncExt"命令で行います。
これはモジュール内でDLLのハンドルを格納しておく配列変数の定義を行っているだけです。

DLLのロードは"LoadLib"命令で行います。
これは初期化時に確保した配列変数にDLLのハンドルを格納しています。
1番目の引数はDLL名、2番目の引数は配列変数の何番目のインデックスに格納するかを指定しています。

引数は配列変数に格納して指定します。
今回呼び出す"Calc"関数の引数は引数は2つなのでこんな感じで。
arg = 3,7

引数を格納したら"ExecFunc"命令で関数を実行します。
この命令は"LoadLib"命令で指定したID、関数名、配列変数、引数の数を指定します。
関数を実行してみると、使用したDLLによって戻り値が異なっています(当然ですが・・・)。

最後にロードしたDLLを"ExitCallFuncExt"命令で開放します。
この処理は必ず行ってください。これを忘れると良くないことになると思います。


今回は2つの数字を引数としてDLLに渡しましたが、画像処理を行うDLLにVRAMバッファへのポインタなんかを渡してやれば、プラグインらしいことができるんじゃないでしょうか。

更新日:2008/5/6