home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1998 March
/
VPR9803A.ISO
/
OLS
/
Windows
/
TAR32023
/
TAR32023.EXE
/
SDK
/
DLL_TECH.TXT
< prev
next >
Wrap
Text File
|
1997-09-02
|
4KB
|
63 lines
----------------------------------------------
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:間接引数展開ルーチン
疲れたのでこの変でとりあえず終わります。