WonderWitch.Com ■TOPネタ
・ILの作り方
インダイレクトライブラリの作り方について。

インダイレクトライブラリって何ですか? [みう] No.15862003/08/04(月) 04:04:31

今回は、「インダイレクトライブラリって何ですか?」というご質問です。インダイレクト・ライブラリ(IL)については、「WonderWitch デベロッパーズ マニュアル」をお読みください。

ソフトウェアアーキテクチャ>インダイレクト・ライブラリ
ユーザILの実装と利用
、、、 以上。
このままだと話が終わってしまうので、もう少し続けます。ILというのは、 動的に付けたり外したりできるライブラリ のことです(WindowsのDLLみたいなもの)。ファイルとして独立できるので、他のプログラムで使いまわせるメリットがあります。ILを沢山用意して、プログラムを巨大化させることもできます。
あと、自分で作成したILのことを「ユーザIL」と呼ぶようです(恥ずかしながら、自分はいまだにユーザILを作ったことがありません)。“WWitch\sample\il”フォルダには、ユーザILを作成するためのサンプルが用意されています。
サンプルのインダイレクトライブラリ(IL)は 「foo.il」 と名付けられています。ファイルの中身はこのとおり。“c0ilib.obj”はIL専用の初期化ルーチンのオブジェクトです。“fooclass.obj”は、「IL構造体」のオブジェクトです。“foo.obj”は関数などを格納したオブジェクトです。



▲“fooclass.c”内にある、IL構造体の記述です。ここでは、インダイレクトライブラリ(IL)の情報を格納します。ドキュメントには書いてないんですが、 「メソッド」の値は「公開してる関数の数+1」 にするようです。この場合、関数が2つなので、「3」になっています。
ILの呼び出し側“footest.fx”のソースコード(footest.c)です。ILを使うためには、まずIL構造体を定義して、ライブラリをオープンする必要があります。
そして、この構造体を介して関数を呼び出します。例えば、構造体「fooIL」を定義した場合、「fooIL.bar();」や「fooIL.baz(12);」となります。

■ビルド
これが、“foo.il”と“footest.fx”をビルドするためのメイクファイル(makefile)です。あと、重要な点ですが、デベロッパーズ・マニュアルによると、 「IL構造体は、テキストセグメントの先頭に配置」しないといけない そうです。「テキストセグメント」とは、主にプログラムを格納するメモリ領域のことです(コードセグメントともいいます)。
このため、IL構造体(fooclass)のコンパイルには 「Turbo-C」 のコンパイラ(tcc)を使ってます。「-z」オプションでセグメントを割り当てています。一方、ファイルのリンクには 「LSI C-86」 のリンカ(lcc86)を使っています。
結果、LSI C-86と、Turbo-Cの両方を使う わけですが、ちょっと見た目が煩雑です。もうちょっとスマートな方法はないんでしょうか? 一応、DMCを使ってビルドするソースが公開されているようです。
うまくビルドできたかは、“foo.map”で確認できます。
Start Stop Length Name Class
00000H 00093H 00094H _TEXT CODE
00094H 000AFH 0001CH TEXT CODE
000B0H 00111H 00062H _DATA DATA
00120H 00120H 00000H DATA DATA
00120H 00120H 00000H _BSS BSS

(略)
Address Publics by Value
0000:0000 _fooIL
0000:0012 _foo_get_info
0000:001D _foo_bar
0000:0032 _foo_baz
0000:005F _text_put_string
0000:007C _text_put_numeric
0000:0094 _il_get_ds
0000:00A3 _il_to_far
000B:0000 _bar_msg
000B:000A _baz_msg

、、、fooILがテキストセグメント先頭に位置していれば成功です。

■実行
“foo.il”と“footest.fx”をワンダーウィッチに転送して、実行します。サンプルの実行結果はこちら。サンプルでは、関数「foo_bar」と「foo_baz」を呼び出しています。「foo_baz」から「12」の引数を与えて、同じ戻り値が返ってきたら成功です。


■TOP ▲BACK >NEXT

2003-08-25 Update /Presented by WonderWitch.Com 運営委員会