WonderWitch.Com
■TOP>ネタ |
インダイレクトライブラリの作り方について。 インダイレクトライブラリって何ですか? [みう] 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」の引数を与えて、同じ戻り値が返ってきたら成功です。 |