WonderWitch.Com
■TOP>ネタ |
インダイレクトライブラリの作り方について。 インダイレクトライブラリって何ですか? [みう] No.15862003/08/04(月) 04:04:31 今回は、「インダイレクトライブラリって何ですか?」というご質問です。インダイレクト・ライブラリ(IL)については、「WonderWitch デベロッパーズ マニュアル」をお読みください。 ソフトウェアアーキテクチャ>インダイレクト・ライブラリ ユーザILの実装と利用 、、、 以上。 このままだと話が終わってしまうので、もう少し続けます。ILというのは、 動的に付けたり外したりできるライブラリ のことです(WindowsのDLLみたいなもの)。ファイルとして独立できるので、他のプログラムで使いまわせるメリットがあります。ILを沢山用意して、プログラムを巨大化させることもできます。 あと、自分で作成したILのことを「ユーザIL」と呼ぶようです(恥ずかしながら、自分はいまだにユーザILを作ったことがありません)。“WWitch\sample\il”フォルダには、ユーザILを作成するためのサンプルが用意されています。 ![]() ![]() ▲“fooclass.c”内にある、IL構造体の記述です。ここでは、インダイレクトライブラリ(IL)の情報を格納します。ドキュメントには書いてないんですが、 「メソッド」の値は「公開してる関数の数+1」 にするようです。この場合、関数が2つなので、「3」になっています。 ![]() そして、この構造体を介して関数を呼び出します。例えば、構造体「fooIL」を定義した場合、「fooIL.bar();」や「fooIL.baz(12);」となります。 ■ビルド ![]() このため、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がテキストセグメント先頭に位置していれば成功です。 ■実行 ![]() |