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 >
Text File  |  1997-09-02  |  4KB  |  63 lines

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