
便利機能を集めたライブラリと呼ばれるプログラムを作成していきましょう。
Windows 環境上で、様々な機能をまとめたライブラリを「DLLファイル」という形式で作成することができます。
DLLファイルは、Dynamic Load Library の略で、「動的に読み込みのできるライブラリ」のことです。 DLL を作ることで、こんなメリットがあります。
今回は、簡単な機能を DLL ファイルにしてみて、 別のプログラムから DLL の機能を呼び出してみましょう。
簡単なhp計算の関数 calcHitpoint を作成してみます。
__declspec(dllexport) int __cdecl calcHitpoint( int lv ) {
return lv * 5;
}
今までになかった、「__declspec(dllexport)」、「__cdecl」 といった属性が関数の宣言に追記されています。
DLLにしたときに、利用可能な関数にこの属性を記載します。 もし、DLLの中だけで呼ばれる、関数であれば、記載する必要はありません。
今回は関数 calcHitpoint は DLL にしたとき、別のプログラムから呼出しできるようにしたいので、 「__declspec(dllexport)」を記載しておきます。
declspec の意味 declspec は Declaration of Specification の意味です。
「__cdecl」は呼出し規約(Calling Convention)と呼ばれるキーワードの一つで、 cdecl は C declaration の略で、つまり C 言語の関数宣言のことを指しています。
この __cdecl を関数の宣言時に記載してあげることで、外部から DLL のこの関数を呼び出すとき、 どんな風に呼び出したらよいのかをコンパイラに教えてあげる役割を果たします。
今回は通常のC言語の作り方で DLL の関数を作成するので、「__cdecl」の呼出し規約を指定しておきます。
呼出し規約 「__cdecl」の他、呼出し規約には 「__stdcall」 などがあります。 Windows 標準の機能を利用するときに、使います。
では、今回のプログラムを DLL にしてみましょう!
gcc -o dll_ex.dll -s -shared dll_ex.c -Wl,--subsystem,windows
特に問題なければ、これで「dll_ex.dll」ファイルが出来上がります!
-Wl,--subsystem,windowsオプション
「-Wl,--subsystem,windows」は Windows 関連の機能を DLL 内で利用するときに
リンカに手動で、機能利用を伝えるするためのオプションです。
今回の場合は、 DLL 内の関数では Windows 関連機能を使用していないので、付けなくても問題ありません。
出来あがった DLLファイル(dll_ex.dll)を別のプログラムを作成して、呼び出してみましょう。 今回は呼び出す側も C 言語で作成します。
#include <stdio.h>
__declspec(dllimport) int __cdecl calcHitpoint(int lv);
int main() {
printf("%d\n", calcHitpoint(5));
}
2 行目で、呼び出したい関数の宣言を書いてあげます。 関数の実態(定義)は DLL を参照し、DLL の中身が実行されます。
呼ぶ側は「__declspec(dllimport)」と記載している部分がちょっと違いますね。
あとは DLL の中身を定義したときと一緒です。 このソースコードをコンパイルしてみましょう。
コンパイルする際に、ファイル「dll_ex.dll」を利用することを明記します。
gcc usedlll_ex.c -o usedll.exe -L. -ldll_ex
問題なければ、usedll.exe ファイルが出来上がります。
出来上がった usedll.exe をコンソールから実行します。
> .\usedll.exe
25
ちゃんとcalcHitpoint関数が実行された結果が表示されました。
usedll.exe の中で、 calcHitpoint 関数が呼ばれたときは、 dll_ex.dll ファイルの実際の calcHitpoint 関数が呼び出され実行されます。
ためしに、usedll.exe はそのままにして、 DLLファイルの中身である、 dll_ex.c の計算式部分を下のように書き換えてみます。
__declspec(dllexport) int __cdecl calcHitpoint( int lv ) {
return lv * 100;
}
再度 dll_ex.c を DLL ファイルにコンパイルしてから、 usedll.exe を実行すると、 ちゃんと、新しい calcHitpoint 関数が呼び出されて、下のような結果になりました。
> .\usedll.exe
500
このように一部の機能を分けることで、 例えば、キャラクタの体力を計算するプログラム開発と、 ゲームエンジンを開発するプログラム開発の担当を分けるなどもできるようになります。
コメント、ありがとうございます。
ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。
Twitter:@NodachiSoft_jpお名前:以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください
お名前: