---------------------------------------------- DLL作成にあたって。。。 #読まなくてもいいよ(^^; ---------------------------------------------- ここにはDLL版作成にあたってわかったことや,考えたことなどをかきます。 ひょっとしたら役にたつかもしれないので,, 文面は結構いいかげんです(^^; DLL作成にあたってとりあえずは,tar関数さえ用意すればいいので,簡単ではないか?と思っていました。また,FindFirst系関数をサポートしたい,というのと,gzip単独圧縮/解凍もしたいと思いました。 まず,DOS版のtarですが,僕はkmtar Power upKitをもともとを使っていました。これは,tar.gz/tar.zなどのファイルを圧縮/解凍できるというなかなか便利なものでした。 とりあえず,これをVC++ Ver4.0でコンパイルしてみました。 つまり,全部の.C/.Hファイルをプロジェクトにほうりこんでみました。 が,できない。。 なぜか見てみると,open,write関数がVCでは_open,_write関数になっています。 そこで,このへんの定義をまとめるため,defconf.hというファイルを作成しました。 それで,すべてのファイルはこのdefconf.hをincludeするようにしました。 また,defconf.hの先頭にVC4/GZIP(gzip解凍のサポート)/DLL/WIN/LONG_FILE_NAME/P_up_V(=3)を定義しました。この定義をはずせば,元にもどる(はず)です。 あと,結構迷ったのがBINARYmodeでの書き出しです。main.cに_fmode=O_BINARYというのがあったので,この部分を有効にしました。 紆余曲折でとりあえずコンパイル完了です。 次に,PowerUpのバージョン4を作り(#define P_up_V 4),gzip/compress単独で圧縮/解凍できるようにし,これをGコマンドとしました。 あとは,分析して,tar32.cppにAPI部分を書きました。 また,staticな変数が最初は「0」というのに依存しているものがあったので, tarなどのAPIを起動するときには,変数を初期化すべく,static_init_all関数(main.c)を呼ぶようにしました。 あと,標準出力にエラーを表示しているのを,APIに返すようにしました。 これは,ioctrl.cがその役割をしています。 ioctrl.hを見ればわかるかもしれませんが,printfなどをioctrl_printfと定義し, 出力を奪うようにしました。元のprintfはorig_printfとして保存しています。#defineではうまくいかないので,inlineを使っています。このioctrl.hはすべてのファイルで参照されるように,defconf.hでincludeしています。 また,exit(1)などで終了しているので,これをlongjmpに変えて,終了しないようにしました。 ファイル構成を適当に書いてみました。 archio.c:open_arch関数で圧縮ファイルを開く模様。。 Archives[0]にファイル名を入れて,Archives[1]にNULLを入れるみたい。 引数は"r","w"などのモード(たぶん) write_z関数などがあり,ここでgzipファイル/普通ファイルへの書き出しの差を吸収している。 compapi.c/compress.c:compress関係のソース chkfname.c:ファイル名が正しいかのチェックをnormalize_fname関数で行っている。 defs.h:いろいろな定義を集めたもの,DLLではdefconf.hにも定義をした。 fildfile.c:dos_findfirst系の関数がVC++ではなかったのでここで作成した。 int86bp.s:アセンブラは使ってないので関係ありません。 ioctrl.c:printfをorig_printfにうつし,ioctrl_printfをprintfにうつした。 IO_TESTを定義すると,標準出力にも表示します。 main.c:その名のとうり,mainです。もともとのmainはtar_mainとしました。 Archives配列には圧縮ファイル名が入る。最後にはNULLを入れる。 Vflagなどは,「v」オプションが指定されたときにTRUEになります。 global変数になっていて,他のarchio.cなどからも参照されています。 これらの変数はmain_static_init関数で初期化しています。 makefile.*:makefileは使っていません。定義はすべてdefconf.hでしてしまっています。misc.c:fatal関数などの共通の関数が定義されています。 tailor.h:結構いろいろ定義されています。 tapeio.c:フロッピーデバイス直接書き出しなどがあります。このへんはダミー関数 に入れ替えました。(fdcs関数など) tar32.cpp:dllのAPIが入っています。 version.c:バージョン番号などが入ってます。 setarg.c:間接引数展開ルーチン 疲れたのでこの変でとりあえず終わります。