home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 March / Chip_2002-03_cd1.bin / zkuste / delphi / kompon / d5 / cak / CAKINST.ZIP / cmarc139.lzh / ARCHIVES.PAS next >
Encoding:
Pascal/Delphi Source File  |  2001-08-21  |  71.6 KB  |  1,913 lines

  1. // ô¥ìçâAü[âJâCâoâRâôâ|ü[âlâôâg for Delphi/C++Builder
  2. // Common Archivers Component for Delphi/C++Builder
  3. // Copyright(C) NORG1964/Masashi Yoneda 1997-2001
  4. //
  5. // èεû{âéâWâàü[âï  ARCHIVES.PAS
  6. //
  7. // v1.00:Åëè·î÷èJâoü[âWâçâô
  8. // v1.01:Open/Close âüâ\âbâhé≡ FindOpen/FindClose é╔ëⁿû╝
  9. // v1.02:LHA32/ARJ32 âåâjâbâgé╠ uses É▀é⌐éτòsÄgùpâåâjâbâg Forms é≡èOé╡é╜
  10. //       âtâ@âCâïâèâXâgâpâëâüü[â^é╠î^é≡ TStrings é╔ò╧ìX
  11. //       â^âCâgâïé╠âRâüâôâgé≡Äßè▒ò╧ìX
  12. // v1.03:LMZIP32é╓é╠æ╬ë₧üFêΩùùĵô╛é¬ë┬ö\é╔
  13. //       Delphi 3 é╔æ╬ë₧
  14. // v1.04:LMZIP32é╓é╠æ╬ë₧üFÅæî╔é╠ì∞ɼé¬ë┬ö\é╔
  15. // v1.05:Åæî╔ôαâAâCâeâÇìφÅ£ùpâüâ\âbâhÆ╟ë┴
  16. // v1.06:Åæî╔æÇì∞âüâ\âbâhé╠û▀éΦÆlé¬òsÉ│é╛é┴é╜òsï∩ìçé╠æ╬ì⌠
  17. //       w âIâvâVâçâôé╠î^é╠îδéΦé≡ÅCÉ│
  18. //       âGâëü[ÆΦÉöé╠ÆΦï`é≡Æ╟ë┴
  19. // v1.07:éóé┬é╠è╘é╔é⌐âCâôâXâgü[âïï@ö\é¬Ä╕éφéΩé─éóé╜é╠é≡ÅCÉ│
  20. // v1.08:âtâ@âCâïû╝ü^âpâXû╝âIâvâVâçâôÉ╢ɼé╠òsï∩ìçæ╬ì⌠
  21. // v1.09:Update/ExtractTo âüâ\âbâhé≡ PackTo/UnpackTo é╔ëⁿû╝
  22. //       CAB/ZIPî`Ä«Åæî╔ùpé╠Åêù¥é╔îoë▀â_âCâAâìâOö±ò\ĪâIâvâVâçâôé≡Ä└æò
  23. //       CAB/ZIPî`Ä«Åæî╔ùpé╠âRâ}âôâhâëâCâôÉ╢ɼé╠òsï∩ìçé≡ÅCÉ│
  24. // v1.10:TAR32.DLL é╔æ╬ë₧üFÅæî╔é╠ì∞ɼüEë≡ôÇüEêΩùùĵô╛é¬ë┬ö\é╔
  25. // v1.11:èeâNâëâXé╠âüâ\âbâhÉΘî╛é╠îδéΦé≡Æ∙É│
  26. //       TArchiver é╔ MakeSfx é╠âfâtâHâïâgâüâ\âbâhé≡Æ╟ë┴
  27. //       òsùvò╧Éöé╠ÉΘî╛é≡ìφÅ£
  28. // v1.12:TArchiveFile é╔ Output/OutputSize âvâìâpâeâBé≡Æ╟ë┴
  29. //       tgz/zip î`Ä«é╠ê│ÅkâîâxâïâIâvâVâçâô( jm )é≡Ä└æò
  30. //       tar ïNô«îπé╔Ä⌐ò¬é╔âtâHü[âJâXé≡û▀é╖Åêù¥é≡Æ╟ë┴
  31. //       zip î`Ä«Åæî╔é┼é╠ RemoveItem ï@ö\âTâ|ü[âg
  32. //       ôαòöâüâ\âbâhé╠Ä└æòé≡Äßè▒ò╧ìX
  33. // v1.13:TArchiveFile é≡âtâHü[âÇé╔ô\éΦé┬é»é─Ägùpé╖éΘì█é╠âìü[âhâGâëü[ë±ö≡
  34. //       UNZIP32.DLL é¬æ╢ì▌é╡é─éα ZIP Åæî╔é¬ë≡ôÇé┼é½é╚é⌐é┴é╜òsï∩ìçé╠ÅCÉ│
  35. //       âvâìâpâeâBé╠ÉΘî╛é╔ default/nodefault âIâvâVâçâôé≡é┬é»é╜
  36. //       TArchiver é╔ PackTo é╠âfâtâHâïâgâüâ\âbâhé≡Æ╟ë┴
  37. //       gr âIâvâVâçâôé╠î^é╠îδéΦé≡ÅCÉ│
  38. //       ôαòöâüâ\âbâhé╠Ä└æòé≡Äßè▒ò╧ìX
  39. // v1.14:TGZ é╠Ä⌐î╚ë≡ôÇî`Ä«ì∞ɼï@ö\âTâ|ü[âgèJÄnü|TAR32.DLL 0.31 ê╚ì~é¬òKùv
  40. //       BZ2 î`Ä«Åæî╔é╠âTâ|ü[âgèJÄnü|TAR32.DLL 0.40 ê╚ì~é¬òKùv
  41. // v1.15:âtâ@âCâïâtâBâïâ^ü[ï@ö\âTâ|ü[âgì∞ï╞èJÄn
  42. //       ZIP32J é┼é╠ê│ÅkâîâxâïâIâvâVâçâôÉ╢ɼé╠îδéΦé≡Æ∙É│
  43. // v1.16:CAB î`Ä«é┼é╠ r âIâvâVâçâôÅêù¥é≡Ä└æò
  44. //       Åæî╔ì∞ɼÄ₧é╔Ä⌐æOé┼âtâ@âCâïâèâXâgé≡É╢ɼé╖éΘï@ö\é≡Æ╟ë┴ü|ò]ë┐ùpé╔î÷èJ
  45. //       ô╞Ä⌐âtâBâïâ^Ä└æòé╔é╞éαé╚éó Options.d é≡öpÄ~
  46. //       tar/tgz Åæî╔é⌐éτé╠Ä⌐î╚ë≡ôÇÅæî╔É╢ɼò√û@é≡ò╧ìXü|û{ôûé╔É╢ɼé¬ë┬ö\é╔
  47. //       ZIP32J.DLL é╓é╠:rüEa âIâvâVâçâôé╠É╢ɼò√û@é≡Æ╟ë┴ü^Æ∙É│
  48. //       ô«ì∞é╡é╚éóé╠é┼ ZIP32J.DLL é╓é╠ jo/job( t/tt ) é╠âTâ|ü[âgé≡ÆföO
  49. //       âîâXâ|âôâXâtâ@âCâïé≡É╢ɼé╡é─Ägùpé╖éΘï@ö\é≡Æ╟ë┴
  50. //       tar è╓ÿAé╠Ä⌐î╚ë≡ôÇÅæî╔é╠ö╗ÆΦÅêù¥é≡Ä└æò
  51. // v1.17:ZIP32J 0.20 é╔æ╬ë₧ü|LMZIP32.DLL é╚é╡é┼êΩùùĵô╛é¬ë┬ö\é╔
  52. //       âAü[âJâCâoécékékï¡Éºâèâèü[âXï@ö\ ReleaseArchiverDLL é≡Æ╟ë┴
  53. //       é╗éΩé╔ö║é╚éó LoadDll/FreeDll/IsXXXArchive é╠ì\ɼò╧ìX
  54. //       û╝æOé≡è╘êßé┴é─éóé╜âvâìâpâeâB Output é≡ëⁿû╝
  55. //       LMZIP32.DLL é┼ê│Åké┼é½é╚é¡é╚é┴é─éóé╜é╠é≡ÅCÉ│
  56. //       PackFilter é╠âVâôâ{âïû╝é≡ò╧ìX
  57. //       âtâBâïâ^è╓ÿAé╠ÅCÉ│
  58. //       Find în function é╠üuô`ô¥ôIé╚âoâOüvé╓é╠æ╬ì⌠
  59. //       System/Hidden âfâBâîâNâgâèôαé╠âtâ@âCâïé¬æ╬Å█é╔é╚éτé╚é⌐é┴é╜òsï∩ìçé╠ÅCÉ│
  60. //       ì─ïAîƒì⌡Åêù¥é╠ìéæ¼ë╗ü|é╗é╠éP
  61. //       FindClose ö▓é»ÅCÉ│
  62. // v1.18:Delphi 4 é┼é╠âRâôâpâCâïâGâëü[é╔æ╬Åê
  63. // v1.19:ZIPî`Ä«Åæî╔é⌐éτé╠Ä⌐î╚ë≡ôÇÅæî╔ì∞ɼï@ö\é≡Ä└æò
  64. // v1.20:Ä⌐î╚ë≡ôÇÅæî╔ì∞ɼâpâXÄwÆΦï@ö\Æ╟ë┴
  65. //       C++ Builder 3 é┼é╠âRâôâpâCâïâGâëü[ë±ö≡üiô«ì∞ûóèmöFüj
  66. // v1.21:DirectoryExists é╠Ä└æòé≡ò╧ìX ( Delphi 4.X æ╬ë₧ )
  67. //       è┐ÄÜâpâXû╝é╓é╠æ╬ë₧é╠ï¡ë╗
  68. //       üETCmdOpt.AddPath é╠Ä└æòé≡ò╧ìX
  69. //       üEGetLastChar é╠Ä└æòé≡ò╧ìX( Delphi 2 æ╬ë₧ )
  70. // v1.22:îoë▀âCâxâôâgâTâ|ü[âgé≡Æ╟ë┴
  71. //       ReleaseDLL é¬ô«ì∞é╡é╚é⌐é┴é╜é╠é≡ÅCÉ│
  72. // v1.23:Åæî╔â`âFâbâNüEÅæî╔ìXÉVï@ö\Æ╟ë┴
  73. //       Äσùvé╚î÷èJâüâ\âbâhé╠ëⁿû╝üEâpâëâüü[â^Æ╟ë┴
  74. //       âüâéâèèJò·Åêù¥é╠ôOÆΩ
  75. // v1.24:ZIPî`Ä«é┼âRâ}âôâhâëâCâôé╠âpâXâfâèâ~â^é≡'/'é╔é╡é╜
  76. //       UNARJ32J.DLL é¬î⌐é┬é⌐éτé╚éóÄ₧é╠âüâbâZü[âWé≡ÅCÉ│
  77. // v1.25:ZIP32J.DLLé┼é╠û╝æOé╔"["é≡è▄é▐âtâ@âCâïé╓é╠æ╬ë₧
  78. // v1.26:CAB32.DLL v0.81 é╔æ╬ë₧
  79. // v1.27:îoë▀âCâxâôâgé¬òsê└ÆΦé╛é┴é╜é╠é≡ÅCÉ│
  80. // v1.28:âüâéâèôWèJï@ö\é╠âTâ|ü[âgé≡Æ╟ë┴
  81. //       û▀éΦÆlé≡â`âFâbâNé╡é─é╡é─ùßèOé≡ö¡É╢é╖éΘ ArchiverCheck è╓Éöé≡Æ╟ë┴
  82. //       MakeSFX âüâ\âbâhÆåé╔ OnProgress âCâxâôâgé≡ùLî°é╔é╡é╜
  83. //       CheckArchive âüâ\âbâhé╠û▀éΦÆlé╠î^é≡ò╧ìX
  84. //       C++ Builder 3/5 é╔ÄbÆΦæ╬ë₧
  85. // v1.29:Delphi 2 é┼âRâôâpâCâïâGâëü[é¬ö¡É╢é╖éΘé╠é≡ÅCÉ│
  86. // v1.30:èeâüâ\âbâhé╠ FileList ê°Éöé╠î^é≡ò╧ìX
  87. //       Delphi 3 é┼âRâôâpâCâïâGâëü[é¬ö¡É╢é╖éΘé╠é≡ÅCÉ│
  88. // v1.31:BGA32.DLLé╔éµéΘGZA/BZAî`Ä«é╓é╠æ╬ë₧é≡èJÄn
  89. //       ôαòöâtâBâïâ^Ä└ìsÆåé╠ProgressâCâxâôâgö¡É╢ï@ö\é≡Æ╟ë┴
  90. //       Ä⌐î╚ë≡ôÇÅæî╔é╠î`Ä«ö╗ÆΦé╠ùDɵÅçÅÿé≡ò╧ìX ( ZIP é╠ùDɵÅçê╩é≡ë║é░é╜ )
  91. // v1.32:YZ1.DLL/YYZ32.DLLé╔éµéΘYZ1î`Ä«Åæî╔é╓é╠æ╬ë₧é≡èJÄn
  92. //       PackFilter é╠Åëè·Ælé≡ pfComponent é╔ò╧ìX
  93. //       IsZipArchive/IsBgaArchive é╠Ä└æòé≡ò╧ìX
  94. //       Åæî╔î`Ä«é¬ô┴ÆΦé┼é½é╚é⌐é┴é╜Ä₧é╔ MakeSfx ôαé┼ Access Violation é¬
  95. //       ö¡É╢é╖éΘòsï∩ìçé≡ÅCÉ│
  96. // v1.33:ôαòöâtâBâïâ^Ä└ìsæOé╔ DLL ùLû│é≡â`âFâbâNé╖éΘï@ö\é≡Æ╟ë┴
  97. // v1.34:ôαòöâtâBâïâ^é╔èεÅÇâfâBâîâNâgâèé≡ê╙Ä»é╡é╜Åêù¥é≡Æ╟ë┴
  98. //       FindOpen âüâ\âbâhé╔û▀éΦÆlé≡Æ╟ë┴
  99. //       TYZ1 é¬É╢ɼé╖éΘâRâ}âôâhâëâCâôé≡ YZ1.DLL 0.20 / YYZ32.DLL 0.80
  100. //       ïñÆ╩Ädùlé╔ìçéφé╣é╜
  101. //       TYZ1 é¬Ägùpé╖éΘ DLL é╠èOòöâåâjâbâgé⌐éτé╠ò╧ìXé╔æ╬ë₧
  102. //       TYZ1 é┼YZ1.DLL ôαé┼é╠ùßèOæ╬ì⌠é≡Æ╟ë┴
  103. // v1.36:TAR32.DLL é╔éµéΘ cpio/rpm/deb/ar î`Ä«âTâ|ü[âgé╠Æ╟ë┴
  104. //       UNGCA32.DLL é╔éµéΘ GCA î`Ä«é╠âTâ|ü[âgé≡Æ╟ë┴
  105. //       UNBEL32.DLL é╔éµéΘ BEL î`Ä«é╠âTâ|ü[âgé≡Æ╟ë┴
  106. //            UNLHA32.DLL é╠ js âIâvâVâçâôé╠âTâ|ü[âgé≡Æ╟ë┴
  107. // v1.37:Delphi 6 é╔æ╬ë₧
  108. // v1.38:ôαòöâtâBâïâ^é╔ï¡ÉºôIé╔æèæ╬âpâXé≡ïLÿ^é│é╣éΘï@ö\é≡Æ╟ë┴ ( jfé╔-2 )
  109. //       DLL é⌐éτé╠âGâôâgâèâ|âCâôâgé╠ĵô╛ò√û@é≡ò╧ìX
  110. // v1.39:ÉVAPIé╠êΩòö(GetWriteTimeEx/GetCreateTimeEx/GetAccessTimeEx)é╔æ╬ë₧
  111. //       YZ1.DLL é╠ âpâXâÅü[âhè╓ÿA API é╓é╠æ╬ë₧é≡Æ╟ë┴
  112. //
  113. unit ARCHIVES;
  114.  
  115. interface
  116.  
  117. {$INCLUDE VERSION.INC}
  118.  
  119. uses
  120.     Messages,
  121.     Windows,
  122.     Classes,
  123.     SysUtils;
  124.  
  125. const
  126.     //    TArchiveFile.FindOpen é╠ dwMode é╔ë║ïLârâbâgâ}âXâNé╠ægé▌ìçéφé╣é≡ÄwÆΦé╖éΘ
  127.     M_INIT_FILE_USE            = $00000001;    // âîâWâXâgâèé╠É▌ÆΦé≡Ägùp
  128.     M_REGARDLESS_INIT_FILE    = $00000002;    // üV é≡Ägùpé╡é╚éó
  129.     M_CHECK_ALL_PATH            = $00000100;    // î╡èié╚âtâ@âCâïû╝âTü[â`
  130.     M_CHECK_FILENAME_ONLY    = $00000200;    // üVé≡ìséφé╚éó
  131.     M_USE_DRIVE_LETTER        = $00001000;    // âhâëâCâuû╝é⌐éτèiö[
  132.     M_NOT_USE_DRIVE_LETTER    = $00002000;    // üV é≡èiö[é╡é╚éó
  133.     M_ERROR_MESSAGE_ON        = $00400000;    // âGâëü[âüâbâZü[âWé≡ò\Ī
  134.     M_ERROR_MESSAGE_OFF        = $00800000;    // üVé≡ò\Īé╡é╚éó
  135.     M_RECOVERY_ON                = $08000000;    // öjæ╣âwâbâ_é╠ô╟é▌ö≥é╬é╡
  136.  
  137.     EXTRACT_FOUND_FILE        = $40000000;    // îƒì⌡é│éΩé╜âtâ@âCâïé≡ë≡ôÇ
  138.     EXTRACT_NAMED_FILE        = $80000000;    // ÄwÆΦé╡é╜âtâ@âCâïé≡ë≡ôÇ
  139.  
  140.     (* Åæî╔â`âFâbâNâéü[âh *)
  141.     CHECKARCHIVE_RAPID = $0000;
  142.                                     //    è╚ê╒âéü[âhüB èiö[âtâ@âCâïé╠ CRC â`âFâbâNé═
  143.                                     //    ìséφé╕üCâwâbâ_é╠é▌â`âFâbâNé╡é▄é╖üBé▒é╠âéü[
  144.                                     //    âhé═éeécécÅπé╠Åæî╔âtâ@âCâïé┼Åêù¥é╔Ä₧è╘é¬è|
  145.                                     //    é⌐éΘé╠é≡ûhé«é╜é▀ì┼Åëé⌐éτéRé┬û┌é▄é┼é╠âtâ@âC
  146.                                     //    âïâwâbâ_é╔é┬éóé─é╠é▌â`âFâbâNé≡ìséóé▄é╖üB
  147.                                     //    é▄é╜üCâwâbâ_é¬î⌐é┬é⌐éτé╚éóÅΩìçé═âtâ@âCâïé╠
  148.                                     //    Éµô¬ 128K é▄é┼âwâbâ_é╠îƒì⌡é≡ìséóé▄é╖üB
  149.     CHECKARCHIVE_BASIC = $0001;
  150.                                     //    è╚ê╒âéü[âhüB0 é╠ÅΩìçé╞êßé┴é─é▒é┐éτé═æSé─é╠
  151.                                     //    âtâ@âCâïâwâbâ_é╔é┬éóé─â`âFâbâNé╡é▄é╖üB
  152.     CHECKARCHIVE_FULLCRC = $0002;
  153.                                     //    î╡ûºâéü[âhüB èiö[âtâ@âCâïé╠ CRC éαâ`âFâbâN
  154.                                     //    é╡é▄é╖üBé╜é╛é╡üCâtâ@âCâïé¬Åæé½ì₧é▄éΩé╚éóé╛
  155.                                     //    é»é┼ôWèJÅêù¥é¬ìséφéΩéΘé▒é╞é╔é╚éΘé╠é┼Ä└ìsÄ₧
  156.                                     //    è╘é¬Æ╖é¡é╚éΦé▄é╖üB
  157.  
  158.     (* Åæî╔â`âFâbâNâIâvâVâçâô *)
  159.     CHECKARCHIVE_RECOVERY = $0004;
  160.                                     //    öjæ╣âwâbâ_é≡û│ÄïüBé▒é╠âtâëâOé≡ÄwÆΦé╖éΘé╞üC
  161.                                     //    öjæ╣âwâbâ_é≡û│Äïé╡é─üCé╗éΩê╚ì~é╠èiö[âtâ@âC
  162.                                     //    âïé╓é╠âAâNâZâXé¬ë┬ö\é╔é╚éΦé▄é╖üB
  163.     CHECKARCHIVE_SFX = $0008;
  164.                                     //    Ä⌐î╚ë≡ôÇÅæî╔é⌐é╟éñé⌐é≡èmöFüBÆ╩Åφé╔é¿éóé─é═
  165.                                     //    Åæî╔é╞öFÄ»é│éΩé╜ÅΩìçé╔é═ TRUE é≡ò╘é╡é▄é╖é¬üC
  166.                                     //    é▒é╠âtâëâOé≡ÄwÆΦé╖éΘé╞üCÄ⌐î╚ë≡ôÇÅæî╔é╞öFÄ»
  167.                                     //    é│éΩé╜ÅΩìçé╔Ä⌐î╚ë≡ôÇÅæî╔é╠Äφù▐é≡éáéτéφé╖Éö
  168.                                     //    Ælé≡ò╘é╡é▄é╖üB
  169.     CHECKARCHIVE_ALL = $0010;
  170.                                     //    CHECKARCHIVE_RAPID âéü[âhé┼üC âwâbâ_îƒì⌡é≡
  171.                                     //    âtâ@âCâïé╠é╖é╫é─é╠ù╠êµé╔é┬éóé─ìséóé╜éóÅΩìç
  172.                                     //    é╔ÄwÆΦé╡é▄é╖üB
  173.  
  174.     (* WARNING *)
  175.     ERROR_DISK_SPACE            = $8005;
  176.     ERROR_READ_ONLY            = $8006;
  177.     ERROR_USER_SKIP            = $8007;
  178.     ERROR_UNKNOWN_TYPE        = $8008;
  179.     ERROR_METHOD                = $8009;
  180.     ERROR_PASSWORD_FILE        = $800A;
  181.     ERROR_VERSION                = $800B;
  182.     ERROR_FILE_CRC                = $800C;
  183.     ERROR_FILE_OPEN            = $800D;
  184.     ERROR_MORE_FRESH            = $800E;
  185.     ERROR_NOT_EXIST            = $800F;
  186.     ERROR_ALREADY_EXIST        = $8010;
  187.     ERROR_TOO_MANY_FILES        = $8011;
  188.  
  189.     (* ERROR *)
  190.     ERROR_MAKEDIRECTORY        = $8012;
  191.     ERROR_CANNOT_WRITE        = $8013;
  192.     ERROR_HUFFMAN_CODE        = $8014;
  193.     ERROR_COMMENT_HEADER        = $8015;
  194.     ERROR_HEADER_CRC            = $8016;
  195.     ERROR_HEADER_BROKEN        = $8017;
  196.     ERROR_ARC_FILE_OPEN        = $8018;
  197.     ERROR_NOT_ARC_FILE        = $8019;
  198.     ERROR_CANNOT_READ            = $801A;
  199.     ERROR_FILE_STYLE            = $801B;
  200.     ERROR_COMMAND_NAME        = $801C;
  201.     ERROR_MORE_HEAP_MEMORY    = $801D;
  202.     ERROR_ENOUGH_MEMORY        = $801E;
  203.     ERROR_ALREADY_RUNNING    = $801F;
  204.     ERROR_USER_CANCEL            = $8020;
  205.     ERROR_HARC_ISNOT_OPENED = $8021;
  206.     ERROR_NOT_SEARCH_MODE    = $8022;
  207.     ERROR_NOT_SUPPORT            = $8023;
  208.     ERROR_TIME_STAMP            = $8024;
  209.     ERROR_TMP_OPEN                = $8025;
  210.     ERROR_LONG_FILE_NAME        = $8026;
  211.     ERROR_ARC_READ_ONLY        = $8027;
  212.     ERROR_SAME_NAME_FILE        = $8028;
  213.     ERROR_NOT_FIND_ARC_FILE = $8029;
  214.     ERROR_RESPONSE_READ        = $802A;
  215.     ERROR_NOT_FILENAME        = $802B;
  216.     ERROR_TMP_COPY                = $802C;
  217.     ERROR_EOF                    = $802D;
  218.  
  219.     // âAü[âJâCâoâIâvâVâçâôé╠è∙ÆΦÆlüB
  220.     // èeüXIntegerâ^âCâvé╞stringâ^âCâvâIâvâVâçâôé╠üuûóÉ▌ÆΦüvÅ≤æ╘é≡ò\éφé╖
  221.     aoiUnAssigned = -1;
  222.     aosUnAssigned = #0;
  223.  
  224.     FNAME32_MAX = 512;
  225.  
  226.     (* îoë▀Æ╩ÆmâüâbâZü[âWè╓ÿA *)
  227.     ARCEXTRACT_BEGIN     = 0;    // èYôûâtâ@âCâïé╠Åêù¥é╠èJÄn
  228.     ARCEXTRACT_INPROCESS = 1;    // èYôûâtâ@âCâïé╠ôWèJÆå
  229.     ARCEXTRACT_END       = 2;    // Åêù¥ÅIù╣üAè╓ÿAâüâéâèé≡èJò·
  230.     ARCEXTRACT_OPEN      = 3;    // èYôûÅæî╔é╠Åêù¥é╠èJÄn
  231.     ARCEXTRACT_COPY      = 4;    // âÅü[âNâtâ@âCâïé╠Åæé½û▀é╡
  232.  
  233.     lpszWMARCEXTRACT     = 'wm_arcextract';
  234.  
  235. var
  236.     WM_ARCEXTRACT:            UINT;
  237.  
  238. type
  239.     LPVOID    = Pointer;
  240.     LPBYTE    =^BYTE;
  241.     LPWORD    =^WORD;
  242.     time_t    = LongInt;
  243.     ptime_t   =^time_t;
  244.     THARC     = HGLOBAL;
  245.     LPFARPROC =^FARPROC;
  246.     LPPTR     =^Pointer;
  247.  
  248.     {$IFNDEF VER90}    //    not Delphi 2 ?
  249.         {$IFNDEF VER100} // not Delphi 3 ?
  250.             {$EXTERNALSYM LPVOID}
  251.             {$EXTERNALSYM LPBYTE}
  252.             {$EXTERNALSYM LPWORD}
  253.         {$ENDIF}
  254.     {$ENDIF}
  255.  
  256.     //    âAü[âJâCâoé╠ FindFirst/FindNext âtâ@âôâNâVâçâôé┼Ägùpé│éΩéΘì\æóæ╠
  257.     TIndivisualInfo = packed record
  258.         dwOriginalSize:    DWORD;
  259.         dwCompressedSize:    DWORD;
  260.         dwCRC:                DWORD;
  261.         uFlag:                UINT;
  262.         uOSType:                UINT;
  263.         wRatio:                WORD;
  264.         wDate:                WORD;
  265.         wTime:                WORD;
  266.         szFileName:            array[0..FNAME32_MAX] of char;
  267.         dummy1:                array[0..2] of char;
  268.         szAttribute:        array[0..7] of char;
  269.         szMode:                array[0..7] of char;
  270.         //ê╚ë║é═ô╞Ä⌐ègÆúò¬é╔é┬é½ì\æóæ╠Æåé╠ê╩Æué═ìíîπò█Å╪é│éΩé╚éó
  271.         WriteTime:            TFileTime;
  272.         AccessTime:            TFileTime;
  273.         CreateTime:            TFileTime;
  274.     end;
  275.     PIndivisualInfo = ^TIndivisualInfo;
  276.  
  277.     //    ArchiverProc é╔ôné│éΩéΘì\æóæ╠
  278.     TExtractingInfo = packed record
  279.         dwFileSize:            DWORD;
  280.         dwWriteSize:        DWORD;
  281.         szSourceFileName:    array[0..FNAME32_MAX] of char;
  282.         dummy1:                array[0..2] of char;
  283.         szDestFileName:    array[0..FNAME32_MAX] of char;
  284.         dummy:                array[0..2] of char;
  285.     end;
  286.     TExtractingInfoEx = packed record
  287.         exinfo:                TExtractingInfo;
  288.         dwCompressedSize:    DWORD;
  289.         dwCRC:                DWORD;
  290.         uOSType:                UINT;
  291.         wRatio:                WORD;
  292.         wDate:                WORD;
  293.         wTime:                WORD;
  294.         szAttribute:        array[0..7] of char;
  295.         szMode:                array[0..7] of char;
  296.     end;
  297.     LPEXTRACTINGINFOEX = ^TExtractingInfoEx;
  298.  
  299.     TArchiverProc = function( Handle:HWND;uMsg:UINT;nState:UINT;lpEis:LPEXTRACTINGINFOEX ):BOOL; stdcall;
  300.     LPArchiverProc = ^TArchiverProc;
  301.  
  302.     //    ôαòöé┼ö¡É╢é│é╣éΘùßèO
  303.     EArchiver = class( Exception )
  304.     public
  305.         ErrorCode:    integer;
  306.     end;
  307.     ENoArchiverDLL = class( EArchiver )
  308.     end;
  309.     EEntryNotFound = class( EArchiver )
  310.     end;
  311.  
  312.     //    âAü[âJâCâuî`Ä«Äφò╩
  313.     TArchiverType = ( atLha,atZip,atCab,atArj,atTar,atTgz,atBZ2,atRar,atBga,atYz1,atGCA,atBel,atNone,atAutoDetect );
  314.  
  315.     //    ê│ÅkÄ₧é╠âtâBâïâ^
  316.     TPackFilter = ( pfArchiver,pfComponent );
  317.  
  318.     //    âîâXâ|âôâXâtâ@âCâïé╠ÄgùpÅ≡îÅ
  319.     TResFileUse      = ( ruOnPack,ruOnUnpack,ruOnRemoveItem,ruOnUpdate );
  320.     TResFileUsage = set of TResFileUse;
  321.  
  322.     //    âRâ}âôâhâëâCâôé╠î`Ä«
  323.     TCmdOptFormat = ( cfInner,cfOuter );
  324.  
  325.     TArchiverOptions = class;
  326.     TArchiver = class;
  327.     TCmdOpt = class;
  328.  
  329.     TArchiverProgressEvent = procedure( Sender:TObject;State:Integer;lpEis:LPExtractingInfoEx;var Abort:boolean ) of object;
  330.     //    State é≡ UINT é╔é╖éΘé╞ Delphi é╠âoü[âWâçâôé╔éµé┴é─â\ü[âXé╠î▌è╖ɽé╔ûΓæΦé¬É╢é╢éΘ
  331.  
  332.     TFilterProc = function( FileName:string ):string;
  333.  
  334.     TArchiveFile = class( TComponent )
  335.     private
  336.         FArchiverType:    TArchiverType;
  337.         FArchiver:        TArchiver;
  338.         FOptions:        TArchiverOptions;
  339.         FFileName:        TFileName;            //    Archive FileName
  340.         FCmdLine:        string;                //    É╢ɼé╡é╜âRâ}âôâhâëâCâô ( âfâoâbâOùp )
  341.         FOutputBuff:    string;                //    Åoù═âüâbâZü[âWé≡èiö[é╖éΘâoâbâtâ@
  342.         FOwnerWindow:    HWND;
  343.         FOnProgress:   TArchiverProgressEvent;
  344.  
  345.     protected
  346.         FhArc:            THARC;
  347.  
  348.     private
  349.         procedure ArchiverWndProc( var Message:TMessage );
  350.         procedure DisableEvents;
  351.         procedure EnableEvents;
  352.         procedure DoProgress( State:UINT;lpEis:LPExtractingInfoEx;var Abort:boolean );
  353.  
  354.     protected
  355.         procedure DetectArchiverType;
  356.         procedure SetFileName( ArchiveFileName:TFileName );
  357.         procedure CheckArchiverType;
  358.         procedure SetArchiverType( ArchiverType:TArchiverType );
  359.         procedure SetOutputSize( OutputSize:integer );
  360.         function  GetOutputSize:integer;
  361.         function  GetOutput:string;
  362.  
  363.     public
  364.         constructor Create( AOwner:TComponent ); override;
  365.         destructor    Destroy; override;
  366.  
  367.         //    î÷èJâüâ\âbâh ü| Åæî╔ôWèJü^Åæî╔ì∞ɼü^Åæî╔ôαâtâ@âCâïìφÅ£ü^Ä⌐î╚ë≡ôÇÅæî╔ì∞ɼ
  368.         function UnpackFiles  ( Handle:HWND;Options:TArchiverOptions;DstPath:String;FileList:array of const ):Integer;
  369.         function PackFiles    ( Handle:HWND;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  370.         function RemoveItems  ( Handle:HWND;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  371.         function UpdateArchive( Handle:HWND;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  372.         function MakeSfx      ( Handle:HWND;Options:TArchiverOptions;DstPath:String ):Integer;
  373.         function UnpackToMem  ( Handle:HWND;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD ):Integer;
  374.         function CheckArchive ( CheckMode:integer;CheckOptions:integer ):DWORD;
  375.  
  376.         //    FindFirst / FindNext înâtâ@âôâNâVâçâô
  377.         function FindOpen( Handle:HWND;dwMode:DWORD ):integer;
  378.         function FindFirst( FileMask:string;var IndivisualInfo:TIndivisualInfo ):integer;
  379.         function FindNext (                 var IndivisualInfo:TIndivisualInfo ):integer;
  380.         function FindClose:integer;
  381.  
  382.         //    î├éóî`Ä«é╠âüâ\âbâh
  383. //        function UnpackTo      ( Handle:HWND;DstPath:String;FileList:TStrings ):Integer;
  384. //        function PackTo     ( Handle:HWND;BaseDir:String;FileList:TStrings ):Integer;
  385. //        function RemoveItem ( Handle:HWND;BaseDir:String;FileList:TStrings ):Integer;
  386. //        function MakeSfxFile( Handle:HWND;DstPath:String ):Integer;
  387.  
  388.     public
  389.         // Ä└ìsÄ₧âvâìâpâeâB
  390.         property CmdLine:       string            read FCmdLine;        // É╢ɼé╡é╜âRâ}âôâhâëâCâôé≡èmöFé╖éΘé╜é▀é╠âvâìâpâeâBü|âfâoâbâOùp
  391.         property Output:        string            read GetOutput;    // Åêù¥âìâOĵô╛ùpâvâìâpâeâB
  392. //    property OutputBuff:    string            read GetOutput;    // è╘êßé┴é─éóé╜î├éóû╝æO
  393.  
  394.     published
  395.         //    É▌îvÄ₧âvâìâpâeâB
  396.         property FileName:      TFileName         read FFileName       write SetFileName;
  397.         property OutputSize:    integer           read GetOutputSize   write SetOutputSize;
  398.         property Options:       TArchiverOptions  read FOptions        write FOptions;
  399.         property ArchiverType:  TArchiverType     read FArchiverType   write SetArchiverType;
  400.  
  401.         // âCâxâôâg
  402.         property OnProgress:    TArchiverProgressEvent read FOnProgress write FOnProgress;
  403.     end;
  404.  
  405.     //    âAü[âJâCâo é╠ ô«ì∞É▌ÆΦâIâvâVâçâô
  406.     TArchiverOptions = class( TPersistent )
  407.     protected
  408.         procedure AssignTo( Dest:TPersistent ); override;
  409.     protected
  410.         Fa:    ShortInt;    //    a[0|1|2]                æ«É½é╠ì─î╗üB
  411.         Fc:    ShortInt;    //    c[0|1]                â^âCâÇâXâ^âôâvîƒì╕é≡Å╚ù¬
  412. //        Fd:    ShortInt;    //    d[0|1]                âfâBâîâNâgâèû╝é╠èiö[ü|öpÄ~
  413.         Fe:    ShortInt;    //    e[0|1]                Ä½ÅæâTâCâYé≡ö╝ò¬é╔é╡é─ê│Åk
  414.         Ff:    ShortInt;    //    f[0|1]                âfâBâXâNÄcù╩â`âFâbâNé╠ÆåÄ~
  415.         Fh:    ShortInt;    //    h[0|1|2|3]            âwâbâ_é╠î`Ä«é≡ÄwÆΦ
  416.         Fi:    ShortInt;    //    i[0|1|2]                âtâ@âCâïæIæ≡é┼æσò╢ÄÜé╞żò╢ÄÜé≡ïµò╩
  417.         Fl:    ShortInt;    //    l[0|1|2]                ôWèJâìâOé╠âtâ@âCâïû╝é╠ò\Īû@é╠ò╧ìX
  418.         Fm:    ShortInt;    //    m[0|1|2]                Ä┐ûΓé╔ yes é╞ë╝ÆΦ
  419.         Fn:    ShortInt;    //    n[0|1]                ôWèJÅ≤ï╡â_âCâAâìâOò\Īé╠ù}Ä~
  420.         Fo:    ShortInt;    //    o[0|1|2]                ïîî`Ä«é┼Åæî╔é≡ì∞ɼ
  421.         Fp:    ShortInt;    //    p[0|1|2]                æSâpâXû╝é┼ìçÆv
  422.         Fr:    ShortInt;    //    r[0|1|2]                ì─ïAôIîƒì⌡
  423.         Fs:    ShortInt;    //    s[0|1]                âXâLâbâvò\Īé╠ù}ɺ
  424.         Ft:    ShortInt;    //    t[0|1]                Åæî╔é╠ìXÉVô·Ä₧é╠ÄwÆΦ
  425.         Fu:    ShortInt;    //    u[0|1]                âtâ@âCâïé╠ìXÉVüiÉVé╡éóéαé╠üj
  426.         Fw:    string;        //    w[0|1|<Dirû╝>]        ì∞ï╞ùpâfâBâîâNâgâèé╠ÄwÆΦ
  427.         Fx:    ShortInt;    //    x[0|1]                âfâBâîâNâgâèû╝é≡ùLî°é╔é╖éΘ
  428.         Fy:    ShortInt;    //    y[0|1]                æSé─é╠Ä┐ûΓé╔ yes é╞ë╝ÆΦ
  429.         Fz:    ShortInt;    //    z[0|1|2|<ègÆúÄq>]    ûóê│Åkâtâ@âCâïé╠ÄwÆΦ            ###ègÆúÄqé═âTâ|ü[âgé╡é╚éó###
  430.         Fjc:    ShortInt;    //    jc[0|1]                öjæ╣âwâbâ_é≡û│Äï
  431.         Fjd:    ShortInt;    //    jd[<âTâCâY>]        âfâBâXâNé╠ï≤é½ùeù╩é≡èmöF
  432.         Fje:    ShortInt;    //    je[<âTâCâY>]        Huffman âoâbâtâ@é╠æσé½é│é≡ÄwÆΦ
  433.         Fjf:    ShortInt;    //    jf[0|1]                âïü[âgïLìåé╠ìφÅ£
  434.         Fjh:    ShortInt;    //    jh[0|1]                WindowsNT/95 ÉΩùpé╠â}ü[âNé≡Åæî╔é╔òtë┴
  435.         Fji:    ShortInt;    //    ji[0|1]                ÆZéóâtâ@âCâïû╝é┼èiö[
  436.         Fjm:    ShortInt;    //    jm[0|1|2|3|4]        ê│Åkâîâxâïé≡ÄwÆΦ
  437.         Fjn:    ShortInt;    //    jn[0|1]                ÉVïKâtâ@âCâïé╠é▌
  438.         Fjo:    string;        //    jo[<Ä₧ìÅÄwÆΦ>]        YYMMDDHHMMSS é╠ô·òtê╚ì~
  439.         Fjob:    string;        //    job[<Ä₧ìÅÄwÆΦ>]    YYMMDDHHMMSS é╠ô·òtê╚æO
  440.         Fjp:    ShortInt;    //    jp[0|1]                ÉiÆ╗âoü[é≡âvâìâOâîâXüEâoü[é┼ò\Ī
  441.         Fjr:    ShortInt;    //    jr[0|1]                âtâ@âCâïé╠Æué½è╖éª
  442.  
  443.         Fjsb:    ShortInt;    //    jsb[0|1]                âüâbâZü[âWâïü[âvé≡ë±é│é╚éó
  444.         Fjsc:    ShortInt;    //    jsc[0|1]                ôWèJé┼é½é╚é⌐é┴é╜âtâ@âCâïÉöé≡ò╘é╖
  445.         Fjsd:    ShortInt;    //    jsd[0|1]                ï≤é½ùeù╩ĵô╛é╔Ä╕ösé╡é╜ÅΩìçé╠Åêù¥é≡ÄwÆΦ
  446.         Fjse:    ShortInt;    //    jse[0|1]                ôWèJÄ₧é╠ÅπÅæé½âIü[âvâôôÖé≡âGâëü[é╞é╖éΘ
  447.         Fjsf:    ShortInt;    //    jsf[0|1]                â^âCâÇâXâ^âôâvé╠òΓÉ│é≡ìséφé╚éó
  448.         Fjsl:    ShortInt;    //    jsl[0|1]                ê│ÅküEèiö[âtâ@âCâïé╠Ådòíâ`âFâbâNé≡ìséφé╚éó
  449.         Fjso:    ShortInt;    //    jso[0|1]                SH_DENYNO é┼é╠âIü[âvâôé≡ìséφé╚éó
  450.         Fjss:    ShortInt;    //    jss[0|1]                ïñùLâGâëü[é╠ÅΩìçé╔Åêù¥é≡æ▒ìs
  451.         Fjst:    ShortInt;    //    jst[0|1]                FILETIME ì\æóæ╠âwâbâ_é╠èiö[é≡Å╚ù¬
  452.         Fjsv:    ShortInt;    //    jsv[0|1]                Åæî╔æÇì∞îπé╔Åæî╔é≡â`âFâbâN
  453.         Fjsz:    ShortInt;    //    jsz[0|1]                Å¼ò╢ÄÜé╠ègÆúÄqé≡òtë┴
  454.  
  455.         Fjw:    ShortInt;    //    jw[0|1|2|3|4]        WinSFX/WinSFXM é≡ì∞ɼ
  456.         Fjx:    TStringList;//    jx[<âtâ@âCâïû╝>]    Å£èOé╖éΘâtâ@âCâïû╝
  457.         Fjyc:    ShortInt;    //    jyc[0|1]                âfâBâîâNâgâèì∞ɼé╠èmöFé≡Å╚ù¬
  458.         Fjyd:    ShortInt;    //    jyd[0|1]                âtâ@âCâïìφÅ£é╠èmöFé≡Å╚ù¬
  459.         Fjyk:    ShortInt;    //    jyk[0|1]                Ägùpé┼é½éΘâfâBâXâNùeù╩é╠èmöFé╠Å╚ù¬
  460.         Fjyn:    ShortInt;    //    jyn[0|1]                ÉVâtâ@âCâïû╝é╠ùvïüé╠Å╚ù¬
  461.         Fjyo:    ShortInt;    //    jyo[0|1]                è∙æ╢âtâ@âCâïé╓é╠ÅπÅæé½èmöFé╠Å╚ù¬
  462.         Fjz:    string;        //    jz[<âtâ@âCâïû╝>]    âtâ@âCâïÆìÄ▀é╠âtâ@âCâïé≡ïƒïï
  463.         Fga:    ShortInt;    //    ga[0|1]                Åæé½ì₧é▌òsë┬æ«É½é≡û│Äï
  464.         Fgd:    ShortInt;    //    gd[0|1]                ù]ò¬é╚âfü[â^é╠ìφÅ£
  465.         Fge:    ShortInt;    //    ge[0|1]                ì┼Åëé╠ègÆúÄqé≡öFÄ»
  466.         Fgf:    ShortInt;    //    gf[0|1|2]            é╖é┼é╔éáéΘâtâ@âCâïé╠ìXÉV
  467.         Fgj:    ShortInt;    //    gj[0|1]                x û╜ù▀é≡ e û╜ù▀é╞ô»ùlé╞î⌐é╚é╖
  468.         Fgm:    ShortInt;    //    gm[0|1]                âGâëü[âüâbâZü[âWò\Īé╠ù}Ä~
  469.         Fgn:    ShortInt;    //    gn[0|1|2]            ôWèJâtâ@âCâïé╠ìçîvâTâCâYé≡ 100% é╞é╡é╜ÉiÆ╗âOâëâté╠ò\Ī
  470.         Fgo:    ShortInt;    //    go[0|1]                â_âCâAâìâOé╠âIü[âiü[âEâBâôâhâEé╠ÄwÆΦ
  471.         Fgp:    ShortInt;    //    gp[0|1]                âEâBâôâhâEé≡ Disable é╔é╡é╚éó
  472.         Fgr:    string;        //    gr[<âtâ@âCâïû╝>]    ò╧ìXâtâ@âCâïû╝é≡ïƒïï
  473.         Fgs:    ShortInt;    //    gs[<âTâCâY>]        âwâbâ_îƒì⌡âTâCâYé╠ÄwÆΦ
  474.         Fgu:    ShortInt;    //    gu[0|1]                WinSFXüCDosSFX é╔æSé─é╠âtâ@âCâïé≡èiö[
  475.         Fgw:    ShortInt;    //    gw[0|1|2|3|4]        WinSFX32/WinSFX32M é≡ì∞ɼ
  476.  
  477.         FUserOptions:    string;                    //    Æ╝É┌ÄwÆΦé╠âIâvâVâçâô
  478.         FUserFileList:    string;                    //    Æ╝É┌ÄwÆΦé╠âtâ@âCâïâèâXâg
  479.  
  480.         FPackFilter:    TPackFilter;            //    Åæî╔É╢ɼÄ₧ÄgùpâtâBâïâ^é╠ÄwÆΦ
  481.         FResFileName:    TFileName;                //    âîâXâ|âôâXâtâ@âCâïû╝é╠ÄwÆΦ
  482.         FResFileUsage:    TResFileUsage;            //    âîâXâ|âôâXâtâ@âCâïÄgùpÅ≡îÅé╠ÄwÆΦ
  483.  
  484.     public
  485.         constructor Create;
  486.         destructor    Destroy; override;
  487.         procedure    init;
  488.  
  489.     published
  490.         property a:       ShortInt    read Fa        write Fa        default aoiUnassigned;        //    a[0|1|2]                æ«É½é╠ì─î╗üB
  491.         property c:        ShortInt    read Fc        write Fc        default aoiUnassigned;        //    c[0|1]                â^âCâÇâXâ^âôâvîƒì╕é≡Å╚ù¬
  492. //        property d:        ShortInt    read Fd        write Fd        default aoiUnassigned;        //    d[0|1]                âfâBâîâNâgâèû╝é╠èiö[
  493.         property e:        ShortInt    read Fe        write Fe        default aoiUnassigned;        //    e[0|1]                Ä½ÅæâTâCâYé≡ö╝ò¬é╔é╡é─ê│Åk
  494.         property f:        ShortInt    read Ff        write Ff        default aoiUnassigned;        //    f[0|1]                âfâBâXâNÄcù╩â`âFâbâNé╠ÆåÄ~
  495.         property h:        ShortInt    read Fh        write Fh        default aoiUnassigned;        //    h[0|1|2|3]            âwâbâ_é╠î`Ä«é≡ÄwÆΦ
  496.         property i:        ShortInt    read Fi        write Fi        default aoiUnassigned;        //    i[0|1|2]                âtâ@âCâïæIæ≡é┼æσò╢ÄÜé╞żò╢ÄÜé≡ïµò╩
  497.         property l:        ShortInt    read Fl        write Fl        default aoiUnassigned;        //    l[0|1|2]                ôWèJâìâOé╠âtâ@âCâïû╝é╠ò\Īû@é╠ò╧ìX
  498.         property m:        ShortInt    read Fm        write Fm        default aoiUnassigned;        //    m[0|1|2]                Ä┐ûΓé╔ yes é╞ë╝ÆΦ
  499.         property n:        ShortInt    read Fn        write Fn        default aoiUnassigned;        //    n[0|1]                ôWèJÅ≤ï╡â_âCâAâìâOò\Īé╠ù}Ä~
  500.         property o:        ShortInt    read Fo        write Fo        default aoiUnassigned;        //    o[0|1|2]                ïîî`Ä«é┼Åæî╔é≡ì∞ɼ
  501.         property p:        ShortInt    read Fp        write Fp        default aoiUnassigned;        //    p[0|1|2]                æSâpâXû╝é┼ìçÆv
  502.         property r:        ShortInt    read Fr        write Fr        default aoiUnassigned;        //    r[0|1|2]                ì─ïAôIîƒì⌡
  503.         property s:        ShortInt    read Fs        write Fs        default aoiUnassigned;        //    s[0|1]                âXâLâbâvò\Īé╠ù}ɺ
  504.         property t:        ShortInt    read Ft        write Ft        default aoiUnassigned;        //    t[0|1]                Åæî╔é╠ìXÉVô·Ä₧é╠ÄwÆΦ
  505.         property u:        ShortInt    read Fu        write Fu        default aoiUnassigned;        //    u[0|1]                âtâ@âCâïé╠ìXÉVüiÉVé╡éóéαé╠üj
  506.         property w:        string   read Fw        write Fw        nodefault;                        //    w[0|1|<Dirû╝>]        ì∞ï╞ùpâfâBâîâNâgâèé╠ÄwÆΦ
  507.         property x:        ShortInt    read Fx        write Fx        default aoiUnassigned;        //    x[0|1]                âfâBâîâNâgâèû╝é≡ùLî°é╔é╖éΘ
  508.         property y:        ShortInt    read Fy        write Fy        default aoiUnassigned;        //    y[0|1]                æSé─é╠Ä┐ûΓé╔ yes é╞ë╝ÆΦ
  509.         property z:        ShortInt    read Fz        write Fz        default aoiUnassigned;        //    z[0|1|2|<ègÆúÄq>]    ûóê│Åkâtâ@âCâïé╠ÄwÆΦ            ###ègÆúÄqé═âTâ|ü[âgé╡é╚éó###
  510.         property jc:    ShortInt    read Fjc        write Fjc    default aoiUnassigned;        //    jc[0|1]                öjæ╣âwâbâ_é≡û│Äï
  511.         property jd:    ShortInt    read Fjd        write Fjd    default aoiUnassigned;        //    jd[<âTâCâY>]        âfâBâXâNé╠ï≤é½ùeù╩é≡èmöF
  512.         property je:    ShortInt    read Fje        write Fje    default aoiUnassigned;        //    je[<âTâCâY>]        Huffman âoâbâtâ@é╠æσé½é│é≡ÄwÆΦ
  513.         property jf:    ShortInt    read Fjf        write Fjf    default aoiUnassigned;        //    jf[0|1]                âïü[âgïLìåé╠ìφÅ£
  514.         property jh:    ShortInt    read Fjh        write Fjh    default aoiUnassigned;        //    jh[0|1]                WindowsNT/95 ÉΩùpé╠â}ü[âNé≡Åæî╔é╔òtë┴
  515.         property ji:    ShortInt    read Fji        write Fji    default aoiUnassigned;        //    ji[0|1]                ÆZéóâtâ@âCâïû╝é┼èiö[
  516.         property jm:    ShortInt    read Fjm        write Fjm    default aoiUnassigned;        //    jm[0|1|2|3|4]        ê│Åkî`Ä«é≡ÄwÆΦ
  517.         property jn:    ShortInt    read Fjn        write Fjn    default aoiUnassigned;        //    jn[0|1]                ÉVïKâtâ@âCâïé╠é▌
  518.         property jo:    string   read Fjo        write Fjo    nodefault;                        //    jo[<Ä₧ìÅÄwÆΦ>]        YYMMDDHHMMSS é╠ô·òtê╚ì~
  519.         property job:    string   read Fjob    write Fjob    nodefault;                        //    job[<Ä₧ìÅÄwÆΦ>]    YYMMDDHHMMSS é╠ô·òtê╚æO
  520.         property jp:    ShortInt    read Fjp        write Fjp    default aoiUnassigned;        //    jp[0|1]                ÉiÆ╗âoü[é≡âvâìâOâîâXüEâoü[é┼ò\Ī
  521.         property jr:    ShortInt    read Fjr        write Fjr    default aoiUnassigned;        //    jr[0|1]                âtâ@âCâïé╠Æué½è╖éª
  522.         property jsb:    ShortInt    read Fjsb    write Fjsb    default aoiUnassigned;        //    jsb[0|1]                âüâbâZü[âWâïü[âvé≡ë±é│é╚éó
  523.         property jsc:    ShortInt    read Fjsc    write Fjsc    default aoiUnassigned;        //    jsc[0|1]                ôWèJé┼é½é╚é⌐é┴é╜âtâ@âCâïÉöé≡ò╘é╖
  524.         property jsd:    ShortInt    read Fjsd    write Fjsd    default aoiUnassigned;        //    jsd[0|1]                ï≤é½ùeù╩ĵô╛é╔Ä╕ösé╡é╜ÅΩìçé╠Åêù¥é≡ÄwÆΦ
  525.         property jse:    ShortInt    read Fjse    write Fjse    default aoiUnassigned;        //    jse[0|1]                ôWèJÄ₧é╠ÅπÅæé½âIü[âvâôôÖé≡âGâëü[é╞é╖éΘ
  526.         property jsf:    ShortInt    read Fjsf    write Fjsf    default aoiUnassigned;        //    jsf[0|1]                â^âCâÇâXâ^âôâvé╠òΓÉ│é≡ìséφé╚éó
  527.         property jsl:    ShortInt    read Fjsl    write Fjsl    default aoiUnassigned;        //    jsl[0|1]                ê│ÅküEèiö[âtâ@âCâïé╠Ådòíâ`âFâbâNé≡ìséφé╚éó
  528.         property jso:    ShortInt    read Fjso    write Fjso    default aoiUnassigned;        //    jso[0|1]                SH_DENYNO é┼é╠âIü[âvâôé≡ìséφé╚éó
  529.         property jss:    ShortInt    read Fjss    write Fjss    default aoiUnassigned;        //    jss[0|1]                ïñùLâGâëü[é╠ÅΩìçé╔Åêù¥é≡æ▒ìs
  530.         property jst:    ShortInt    read Fjst    write Fjst    default aoiUnassigned;        //    jst[0|1]                FILETIME ì\æóæ╠âwâbâ_é╠èiö[é≡Å╚ù¬
  531.         property jsv:    ShortInt    read Fjsv    write Fjsv    default aoiUnassigned;        //    jsv[0|1]                Åæî╔æÇì∞îπé╔Åæî╔é≡â`âFâbâN
  532.         property jsz:    ShortInt    read Fjsz    write Fjsz    default aoiUnassigned;        //    jsz[0|1]                Å¼ò╢ÄÜé╠ègÆúÄqé≡òtë┴
  533.         property jw:    ShortInt    read Fjw        write Fjw    default aoiUnassigned;        //    jw[0|1|2|3|4]        WinSFX/WinSFXM é≡ì∞ɼ
  534.         property jx:    TStringList    read Fjx    write Fjx    nodefault;                        //    jx[<âtâ@âCâïû╝>]    Å£èOé╖éΘâtâ@âCâïû╝
  535.         property jyc:    ShortInt    read Fjyc    write Fjyc    nodefault;                        //    jyc[0|1]                âfâBâîâNâgâèì∞ɼé╠èmöFé≡Å╚ù¬
  536.         property jyd:    ShortInt    read Fjyd    write Fjyd    default aoiUnassigned;        //    jyd[0|1]                âtâ@âCâïìφÅ£é╠èmöFé≡Å╚ù¬
  537.         property jyk:    ShortInt    read Fjyk    write Fjyk    default aoiUnassigned;        //    jyk[0|1]                Ägùpé┼é½éΘâfâBâXâNùeù╩é╠èmöFé╠Å╚ù¬
  538.         property jyn:    ShortInt    read Fjyn    write Fjyn    default aoiUnassigned;        //    jyn[0|1]                ÉVâtâ@âCâïû╝é╠ùvïüé╠Å╚ù¬
  539.         property jyo:    ShortInt    read Fjyo    write Fjyo    default aoiUnassigned;        //    jyo[0|1]                è∙æ╢âtâ@âCâïé╓é╠ÅπÅæé½èmöFé╠Å╚ù¬
  540.         property jz:    string   read Fjz        write Fjz    nodefault;                        //    jz[<âtâ@âCâïû╝>]    âtâ@âCâïÆìÄ▀é╠âtâ@âCâïé≡ïƒïï
  541.         property ga:    ShortInt    read Fga        write Fga    default aoiUnassigned;        //    ga[0|1]                Åæé½ì₧é▌òsë┬æ«É½é≡û│Äï
  542.         property gd:    ShortInt    read Fgd        write Fgd    default aoiUnassigned;        //    gd[0|1]                ù]ò¬é╚âfü[â^é╠ìφÅ£
  543.         property ge:    ShortInt    read Fge        write Fge    default aoiUnassigned;        //    ge[0|1]                ì┼Åëé╠ègÆúÄqé≡öFÄ»
  544.         property gf:    ShortInt    read Fgf        write Fgf    default aoiUnassigned;        //    gf[0|1|2]            é╖é┼é╔éáéΘâtâ@âCâïé╠ìXÉV
  545.         property gj:    ShortInt    read Fgj        write Fgj    default aoiUnassigned;        //    gj[0|1]                x û╜ù▀é≡ e û╜ù▀é╞ô»ùlé╞î⌐é╚é╖
  546.         property gm:    ShortInt    read Fgm        write Fgm    default aoiUnassigned;        //    gm[0|1]                âGâëü[âüâbâZü[âWò\Īé╠ù}Ä~
  547.         property gn:    ShortInt    read Fgn        write Fgn    default aoiUnassigned;        //    gn[0|1|2]            ôWèJâtâ@âCâïé╠ìçîvâTâCâYé≡ 100% é╞é╡é╜ÉiÆ╗âOâëâté╠ò\Ī
  548.         property go:    ShortInt    read Fgo        write Fgo    default aoiUnassigned;        //    go[0|1]                â_âCâAâìâOé╠âIü[âiü[âEâBâôâhâEé╠ÄwÆΦ
  549.         property gp:    ShortInt    read Fgp        write Fgp    default aoiUnassigned;        //    gp[0|1]                âEâBâôâhâEé≡ Disable é╔é╡é╚éó
  550.         property gr:    string   read Fgr        write Fgr    nodefault;                        //    gr[<âtâ@âCâïû╝>]    ò╧ìXâtâ@âCâïû╝é≡ïƒïï
  551.         property gs:    ShortInt    read Fgs        write Fgs    default aoiUnassigned;        //    gs[<âTâCâY>]        âwâbâ_îƒì⌡âTâCâYé╠ÄwÆΦ
  552.         property gu:    ShortInt    read Fgu        write Fgu    default aoiUnassigned;        //    gu[0|1]                WinSFXüCDosSFX é╔æSé─é╠âtâ@âCâïé≡èiö[
  553.         property gw:    ShortInt    read Fgw        write Fgw    default aoiUnassigned;        //    gw[0|1|2|3|4]        WinSFX32/WinSFX32M é≡ì∞ɼ
  554.         property UserOptions:    string          read FUserOptions    write FUserOptions;        //    Æ╝É┌ÄwÆΦé╠âIâvâVâçâô
  555.         property UserFileList:    string          read FUserFileList write FUserFileList;        //    Æ╝É┌ÄwÆΦé╠âtâ@âCâïâèâXâg
  556.         property PackFilter:        TPackFilter      read FPackFilter    write FPackFilter default pfComponent;    //    Åæî╔É╢ɼÄ₧ÄgùpâtâBâïâ^é╠ÄwÆΦ
  557.         property ResFileName:    TFileName      read FResFileName    write FResFileName;        //    âîâXâ|âôâXâtâ@âCâïû╝é╠ÄwÆΦ
  558.         property ResFileUsage:    TResFileUsage read FResFileUsage write FResFileUsage;        //    âîâXâ|âôâXâtâ@âCâïÄgùpÅ≡îÅé╠ÄwÆΦ
  559.     end;
  560.  
  561.     //    üuâAü[âJâCâoüvâxü[âXâNâëâXü|èeâAü[âJâCâoé═é▒é╠âNâëâXé⌐éτöhÉ╢é╡é─Ä└æòé╖éΘ
  562.     TArchiver = class
  563.     private
  564.         FOwnerWindow:    HWND;
  565.  
  566.     protected
  567.         FCmdLine:        string;            //    É╢ɼé╡é╜âRâ}âôâhâëâCâô ( âfâoâbâOùp )
  568.  
  569.     protected
  570.         class procedure LoadDll; virtual;
  571.         class procedure FreeDll; virtual;
  572.  
  573.         function  FindOpen ( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ):THARC; virtual;
  574.         function  FindFirst( hArc:THArc;var IndivisualInfo:TIndivisualInfo;FileMask:string ):integer; virtual;
  575.         function  FindNext ( hArc:THArc;var IndivisualInfo:TIndivisualInfo                     ):integer; virtual;
  576.         function  FindClose( hArc:THArc                                                    ):integer; virtual;
  577.  
  578.         //    ôαòöé┼Ägùpé╖éΘâüâ\âbâhü|É▌ÆΦé╡é╜âtâ@âCâïé≡âRâ}âôâhâëâCâôé╔ôWèJé╖éΘ
  579.         procedure AddFileSpec1( CmdLine:TCmdOpt;ArchiveFileName:string;path:string );
  580.         function  AddFileSpec2( CmdLine:TCmdOpt;Options:TArchiverOptions;FileList:array of const;UseResFile:boolean ):integer;
  581.  
  582.     public
  583.         constructor Create;
  584.         destructor    Destroy; override;
  585.  
  586.         //    î÷èJâüâ\âbâhü|ôWèJü^ì∞ɼü^Ä⌐î╚ë≡ôÇÅæî╔ì∞ɼ ï@ö\
  587.         function UnpackFiles  ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;DstPath:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; virtual; abstract;
  588.         function PackFiles    ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; virtual;
  589.         function RemoveItems  ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; virtual;
  590.         function UpdateArchive( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; virtual;
  591.         function MakeSfx      ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;DstPath:String                                           ;var Output:string ):Integer; virtual;
  592.         function UnpackToMem  ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD         ):Integer; virtual;
  593.         function CheckArchive (             ArchiveFileName:string;CheckMode:integer;CheckOptions:integer ):DWORD; virtual;
  594.  
  595.         //    âRü[âïâoâbâNÉ▌ÆΦü^ë≡Å£
  596.         function SetOwnerWindowEx ( Handle:HWND;lpArcProc:LPARCHIVERPROC ):boolean; virtual;
  597.         function KillOwnerWindowEx( Handle:HWND                                 ):boolean; virtual;
  598.         function CallBackEnabled: boolean;
  599.  
  600. {$IFNDEF VER93} // not C++Builder 1 ?
  601.         class procedure ReleaseDLL;
  602. {$ENDIF}
  603.         procedure BeforePack; virtual;
  604.  
  605.         //    É╢ɼé╡é╜âRâ}âôâhâëâCâôé≡ĵô╛é╖éΘé╜é▀é╠âvâìâpâeâB
  606.         property CmdLine:        string        Read FCmdLine;
  607.     end;
  608.  
  609.     //    âRâ}âôâhâëâCâôÉ╢ɼé╠é╜é▀é╠âÅü[âLâôâOâNâëâX
  610.     TCmdOpt = class
  611.     private
  612.         FFormat:            TCmdOptFormat;
  613.         FFilterProc:    TFilterProc;
  614.         FCmdLine:        string;
  615.  
  616.     public
  617.         constructor Create;
  618.         procedure Add( optstr:string );
  619.         procedure AddBolOpt( optstr:string;value:boolean );
  620.         procedure AddIntOpt( optstr:string;value:integer );
  621.         procedure AddIntDef( optstr:string;value:integer;defaultopt:integer );
  622.         procedure AddStrOpt( optstr:string;value:string );
  623.         procedure AddFName1( optstr,filespec:string );    //    âtâBâïâ^é╚é╡âoü[âWâçâô
  624.         procedure AddPath1 ( optstr,pathspec:string );    //    âtâBâïâ^é╚é╡âoü[âWâçâôé╠é▌
  625.         procedure AddFName2( optstr,filespec:string );    //    âtâBâïâ^éáéΦâoü[âWâçâô
  626.         function  AddFList2( optstr:string;FileList:array of const ):integer;    //    âtâBâïâ^éáéΦâoü[âWâçâôé╠é▌
  627.         function  MakeResFile( FileList:array of const;ResFileName:string ):integer;
  628.         function  Filtered( S:string ):string;
  629.  
  630.         property Filter:        TFilterProc        read FFilterProc write FFilterProc;
  631.         property Format:        TCmdOptFormat    read FFormat     write FFormat;
  632.         property Str:            String            read FCmdLine;
  633.     end;
  634.  
  635.     TArcDLLArchiverProc           = function( Handle:HWND;lpszCmdLine:PAnsiChar;lpszOutput:PAnsiChar;dwSize:integer ):integer; stdcall;
  636.     TArcDLLFindOpen               = function( Handle:HWND;ArchiveFileName:PAnsiChar;dwMode:DWORD ):THARC; stdcall;
  637.     TArcDLLFindFirst              = function( hArc:THArc;FileMask:PAnsiChar;IndivisualInfo:PIndivisualInfo ):integer; stdcall;
  638.     TArcDLLFindNext               = function( hArc:THArc;IndivisualInfo:PIndivisualInfo ):integer; stdcall;
  639.     TArcDLLFindClose              = function( hArc:THArc ):integer; stdcall;
  640.     TArcDLLCheckArchive           = function( lpszFileName:PAnsiChar;iMode:integer ):DWORD; stdcall;
  641.     TArcDLLSetOwnerWindowEx       = function( Handle:HWND;lpArcProc:LPARCHIVERPROC ):BOOL; stdcall;
  642.     TArcDLLKillOwnerWindowEx      = function( Handle:HWND ):BOOL; stdcall;
  643.     TArcDLLExtractMem             = function( Handle:HWND;lpszCmdLine:PAnsiChar;lpvBuffer:LPBYTE;dwSize:DWORD;lpTime:ptime_t;lpwAttr:LPWORD;lpdwWriteSize:LPDWORD ):integer; stdcall;
  644.     TArcDLLGetFileTimeEx          = function( hArc:THArc;var lpFileTime:TFileTime ):BOOL; stdcall;
  645.     TTarDLLGetArchiveType         = function( lpszFileName:PAnsiChar ):integer; stdcall;
  646.  
  647.     //    èe Archiver DLL é╠âGâôâgâèâ|âCâôâgé≡ò█Ä¥é╖éΘé╜é▀é╠âNâëâX
  648.     TCustomArchiverDll = class
  649.     protected
  650.         FArchiverProc:                    FARPROC;
  651.         FOpenArchive:                    FARPROC;
  652.         FCloseArchive:                    FARPROC;
  653.         FFindFirst:                        FARPROC;
  654.         FFindNext:                        FARPROC;
  655.         FExtractMem:                    FARPROC;
  656.         FCheckArchive:                    FARPROC;
  657.         FSetOwnerWindowEx:            FARPROC;
  658.         FKillOwnerWindowEx:            FARPROC;
  659.         FGetWriteTimeEx:                FARPROC;
  660.         FGetCreateTimeEx:                FARPROC;
  661.         FGetAccessTimeEx:                FARPROC;
  662.         FGetArchiveType:                FARPROC;        //    TAR32.DLL é╠é▌
  663.     public
  664.         constructor Create;
  665.         destructor Destroy; override;
  666.         procedure LoadDll; virtual; abstract;
  667.         procedure FreeDll; virtual;
  668.         function ArchiverProc( _hwnd:HWND;_lpszCmdLine:PAnsiChar;_lpszOutput:PAnsiChar;_dwSize:DWORD ):integer; virtual;
  669.         function CheckArchive( lpszFileName:PAnsiChar;iMode:integer ):DWORD; virtual;
  670.         function CloseArchive( hArc:THARC ):integer; virtual;
  671.         function ExtractMem( Handle:HWND;lpszCmdLine:PAnsiChar;lpvBuffer:LPBYTE;dwSize:DWORD;lpTime:ptime_t;lpwAttr:LPWORD;lpdwWriteSize:LPDWORD ): integer; virtual;
  672.         function FindFirst( hArc:THArc;FileMask:string;IndivisualInfo:PIndivisualInfo ):integer; virtual;
  673.         function FindNext( hArc:THArc;IndivisualInfo:PIndivisualInfo ):integer; virtual;
  674.         function KillOwnerWindowEx( Handle:HWND ):BOOL; virtual;
  675.         function OpenArchive( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ): THARC; virtual;
  676.         function SetOwnerWindowEx( Handle:HWND;lpArcProc:LPARCHIVERPROC ):BOOL; virtual;
  677.         function GetWriteTimeEx ( hArc:THArc;var lpLastWriteTime:TFileTime ):BOOL; virtual;
  678.         function GetCreateTimeEx( hArc:THArc;var lpCreateTime   :TFileTime ):BOOL; virtual;
  679.         function GetAccessTimeEx( hArc:THArc;var lpAccessTime   :TFileTime ):BOOL; virtual;
  680.         function GetArchiveType( lpszFileName:PAnsiChar ):integer; virtual;
  681.  
  682.     private
  683.         procedure GetAddtitionalInfo( hArc:THArc;IndivisualInfo:PIndivisualInfo );
  684.     end;
  685.  
  686.     TArchiverDll = class( TCustomArchiverDll )
  687.     protected
  688.         FhDLL:                    THandle;
  689.         FArchiveName:            string;
  690.         FDllName:                string;
  691.         FEntryPrefix:            string;
  692.     public
  693.         constructor Create( ArchiveName,DllName,EntryPrefix:string );
  694.         destructor Destroy; override;
  695.         procedure LoadDll; override;
  696.         procedure FreeDll; override;
  697.         function ArchiverProc( _hwnd:HWND;_lpszCmdLine:PAnsiChar;_lpszOutput:PAnsiChar;_dwSize:DWORD ):integer; override;
  698.         function CheckArchive( lpszFileName:PAnsiChar;iMode:integer ):DWORD; override;
  699.         function CloseArchive( hArc:THARC ):integer; override;
  700.         function ExtractMem( Handle:HWND;lpszCmdLine:PAnsiChar;lpvBuffer:LPBYTE;dwSize:DWORD;lpTime:ptime_t;lpwAttr:LPWORD;lpdwWriteSize:LPDWORD ): integer; override;
  701.         function FindFirst( hArc:THArc;FileMask:string;IndivisualInfo:PIndivisualInfo ):integer; override;
  702.         function FindNext( hArc:THArc;IndivisualInfo:PIndivisualInfo ):integer; override;
  703.         function KillOwnerWindowEx( Handle:HWND ):BOOL; override;
  704.         function OpenArchive( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ): THARC; override;
  705.         function SetOwnerWindowEx( Handle:HWND;lpArcProc:LPARCHIVERPROC ):BOOL; override;
  706.         function GetWriteTimeEx ( hArc:THArc;var lpLastWriteTime:TFileTime ):BOOL; override;
  707.         function GetCreateTimeEx( hArc:THArc;var lpCreateTime   :TFileTime ):BOOL; override;
  708.         function GetAccessTimeEx( hArc:THArc;var lpAccessTime   :TFileTime ):BOOL; override;
  709.         function GetArchiveType( lpszFileName:PAnsiChar ):integer; override;
  710.     end;
  711.  
  712. const
  713.     ruNothing:TResFileUse = TResFileUse(-1);
  714.  
  715. function DetectArchiverType( ArchiveFileName:string;DetectByFileExt:boolean ):TArchiverType;
  716.  
  717. {$IFNDEF VER93} // not C++Builder 1 ?
  718. procedure ReleaseArchiverDLL;
  719. {$ENDIF}
  720.  
  721. function ArchiverCheck( ArchiverResult:integer ):integer;
  722. function ArchiverErrorMsg( ArchiverResult:integer ):string;
  723.  
  724. //---------------------------------------------------------------------
  725.  
  726. function GetProcAddr( var EntryPoint:FARPROC;hModule:HMODULE;lpszProcName:string;RaiseException:boolean ):boolean;
  727. function ArrayToList( FileList:array of const ):TStringList;
  728.  
  729. procedure Register;
  730.  
  731. implementation
  732.  
  733. {$OPTIMIZATION ON}
  734. {$BOOLEVAL OFF}
  735.  
  736. uses
  737. {$IFDEF ARCDLL}
  738.     AllocWin,
  739. {$ELSE}
  740.     Forms,
  741. {$ENDIF}
  742. {$IFDEF D6_OR_LATER}
  743.     Variants,
  744. {$ENDIF}
  745.     Lha32,
  746.     Zip32,
  747.     Cab32,
  748.     Arj32,
  749.     Tar32,
  750.     Rar32,
  751.     Bga32,
  752. {$IFDEF USEGCA}
  753.     GCA32,
  754. {$ENDIF}
  755. {$IFDEF USEBEL}
  756.     Bel32,
  757. {$ENDIF}
  758. {$IFDEF USEYZ1}
  759.     YZ132,
  760. {$ENDIF}
  761.     Filters;
  762.  
  763. {$IFNDEF VER90} // not Delphi 2 ?
  764.     {$IFNDEF VER100} // not Delphi 3 ?
  765.         {$HPPEMIT '#include "arcstubs.h"'}
  766.         {$ObjExportAll On}
  767.     {$ENDIF}
  768. {$ENDIF}
  769.  
  770. //---------------------------------------------------------------------
  771. constructor TArchiverOptions.Create;
  772. begin
  773.     inherited Create;
  774.     Fjx    := TStringList.Create;    //    jx[<âtâ@âCâïû╝>]    Å£èOé╖éΘâtâ@âCâïû╝
  775.     init;
  776. end;
  777.  
  778. destructor TArchiverOptions.Destroy;
  779. begin
  780.     Fjx.Free;
  781.     inherited Destroy;
  782. end;
  783.  
  784. procedure TArchiverOptions.init;
  785. begin
  786.     Fa        := aoiUnAssigned;            //    a[0|1|2]                æ«É½é╠ì─î╗üB
  787.     Fc        := aoiUnAssigned;            //    c[0|1]                â^âCâÇâXâ^âôâvîƒì╕é≡Å╚ù¬
  788. //    Fd        := aoiUnAssigned;            //    d[0|1]                âfâBâîâNâgâèû╝é╠èiö[
  789.     Fe        := aoiUnAssigned;            //    e[0|1]                Ä½ÅæâTâCâYé≡ö╝ò¬é╔é╡é─ê│Åk
  790.     Ff        := aoiUnAssigned;            //    f[0|1]                âfâBâXâNÄcù╩â`âFâbâNé╠ÆåÄ~
  791.     Fh        := aoiUnAssigned;            //    h[0|1|2|3]            âwâbâ_é╠î`Ä«é≡ÄwÆΦ
  792.     Fi        := aoiUnAssigned;            //    i[0|1|2]                âtâ@âCâïæIæ≡é┼æσò╢ÄÜé╞żò╢ÄÜé≡ïµò╩
  793.     Fl        := aoiUnAssigned;            //    l[0|1|2]                ôWèJâìâOé╠âtâ@âCâïû╝é╠ò\Īû@é╠ò╧ìX
  794.     Fm        := aoiUnAssigned;            //    m[0|1|2]                Ä┐ûΓé╔ yes é╞ë╝ÆΦ
  795.     Fn        := aoiUnAssigned;            //    n[0|1]                ôWèJÅ≤ï╡â_âCâAâìâOò\Īé╠ù}Ä~
  796.     Fo        := aoiUnAssigned;            //    o[0|1|2]                ïîî`Ä«é┼Åæî╔é≡ì∞ɼ
  797.     Fp        := aoiUnAssigned;            //    p[0|1|2]                æSâpâXû╝é┼ìçÆv
  798.     Fr        := aoiUnAssigned;            //    r[0|1|2]                ì─ïAôIîƒì⌡
  799.     Fs        := aoiUnAssigned;            //    s[0|1]                âXâLâbâvò\Īé╠ù}ɺ
  800.     Ft        := aoiUnAssigned;            //    t[0|1]                Åæî╔é╠ìXÉVô·Ä₧é╠ÄwÆΦ
  801.     Fu        := aoiUnAssigned;            //    u[0|1]                âtâ@âCâïé╠ìXÉVüiÉVé╡éóéαé╠üj
  802.     Fw        := aosUnAssigned;            //    w[0|1|<Dirû╝>]        ì∞ï╞ùpâfâBâîâNâgâèé╠ÄwÆΦ
  803.     Fx        := aoiUnAssigned;            //    x[0|1]                âfâBâîâNâgâèû╝é≡ùLî°é╔é╖éΘ
  804.     Fy        := aoiUnAssigned;            //    y[0|1]                æSé─é╠Ä┐ûΓé╔ yes é╞ë╝ÆΦ
  805.     Fz        := aoiUnAssigned;            //    z[0|1|2|<ègÆúÄq>]    ûóê│Åkâtâ@âCâïé╠ÄwÆΦ            ###ègÆúÄqé═âTâ|ü[âgé╡é╚éó###
  806.     Fjc    := aoiUnAssigned;            //    jc[0|1]                öjæ╣âwâbâ_é≡û│Äï
  807.     Fjd    := aoiUnAssigned;            //    jd[<âTâCâY>]        âfâBâXâNé╠ï≤é½ùeù╩é≡èmöF
  808.     Fje    := aoiUnAssigned;            //    je[<âTâCâY>]        Huffman âoâbâtâ@é╠æσé½é│é≡ÄwÆΦ
  809.     Fjf    := aoiUnAssigned;            //    jf[0|1]                âïü[âgïLìåé╠ìφÅ£
  810.     Fjh    := aoiUnAssigned;            //    jh[0|1]                WindowsNT/95 ÉΩùpé╠â}ü[âNé≡Åæî╔é╔òtë┴
  811.     Fji    := aoiUnAssigned;            //    ji[0|1]                ÆZéóâtâ@âCâïû╝é┼èiö[
  812.     Fjm    := aoiUnAssigned;            //    jm[0|1|2|3|4]        ê│Åkî`Ä«é≡ÄwÆΦ
  813.     Fjn    := aoiUnAssigned;            //    jn[0|1]                ÉVïKâtâ@âCâïé╠é▌
  814.     Fjo    := aosUnAssigned;            //    jo[<Ä₧ìÅÄwÆΦ>]        YYMMDDHHMMSS é╠ô·òtê╚ì~
  815.     Fjob    := aosUnAssigned;            //    job[<Ä₧ìÅÄwÆΦ>]    YYMMDDHHMMSS é╠ô·òtê╚æO
  816.     Fjp    := aoiUnAssigned;            //    jp[0|1]                ÉiÆ╗âoü[é≡âvâìâOâîâXüEâoü[é┼ò\Ī
  817.     Fjr    := aoiUnAssigned;            //    jr[0|1]                âtâ@âCâïé╠Æué½è╖éª
  818.     Fjsb    := aoiUnassigned;            //    jsb[0|1]                âüâbâZü[âWâïü[âvé≡ë±é│é╚éó
  819.     Fjsc    := aoiUnassigned;            //    jsc[0|1]                ôWèJé┼é½é╚é⌐é┴é╜âtâ@âCâïÉöé≡ò╘é╖
  820.     Fjsd    := aoiUnassigned;            //    jsd[0|1]                ï≤é½ùeù╩ĵô╛é╔Ä╕ösé╡é╜ÅΩìçé╠Åêù¥é≡ÄwÆΦ
  821.     Fjse    := aoiUnassigned;            //    jse[0|1]                ôWèJÄ₧é╠ÅπÅæé½âIü[âvâôôÖé≡âGâëü[é╞é╖éΘ
  822.     Fjsf    := aoiUnassigned;            //    jsf[0|1]                â^âCâÇâXâ^âôâvé╠òΓÉ│é≡ìséφé╚éó
  823.     Fjsl    := aoiUnassigned;            //    jsl[0|1]                ê│ÅküEèiö[âtâ@âCâïé╠Ådòíâ`âFâbâNé≡ìséφé╚éó
  824.     Fjso    := aoiUnassigned;            //    jso[0|1]                SH_DENYNO é┼é╠âIü[âvâôé≡ìséφé╚éó
  825.     Fjss    := aoiUnassigned;            //    jss[0|1]                ïñùLâGâëü[é╠ÅΩìçé╔Åêù¥é≡æ▒ìs
  826.     Fjst    := aoiUnassigned;            //    jst[0|1]                FILETIME ì\æóæ╠âwâbâ_é╠èiö[é≡Å╚ù¬
  827.     Fjsv    := aoiUnassigned;            //    jsv[0|1]                Åæî╔æÇì∞îπé╔Åæî╔é≡â`âFâbâN
  828.     Fjsz    := aoiUnassigned;            //    jsz[0|1]                Å¼ò╢ÄÜé╠ègÆúÄqé≡òtë┴
  829.     Fjw    := aoiUnAssigned;            //    jw[0|1|2|3|4]        WinSFX/WinSFXM é≡ì∞ɼ
  830.     Fjx.Clear;                            //    jx[<âtâ@âCâïû╝>]    Å£èOé╖éΘâtâ@âCâïû╝
  831.     Fjyc    := aoiUnAssigned;            //    jyc[0|1]                âfâBâîâNâgâèì∞ɼé╠èmöFé≡Å╚ù¬
  832.     Fjyd    := aoiUnAssigned;            //    jyd[0|1]                âtâ@âCâïìφÅ£é╠èmöFé≡Å╚ù¬
  833.     Fjyk    := aoiUnAssigned;            //    jyk[0|1]                Ägùpé┼é½éΘâfâBâXâNùeù╩é╠èmöFé╠Å╚ù¬
  834.     Fjyn    := aoiUnAssigned;            //    jyn[0|1]                ÉVâtâ@âCâïû╝é╠ùvïüé╠Å╚ù¬
  835.     Fjyo    := aoiUnAssigned;            //    jyo[0|1]                è∙æ╢âtâ@âCâïé╓é╠ÅπÅæé½èmöFé╠Å╚ù¬
  836.     Fjz    := aosUnAssigned;            //    jz[<âtâ@âCâïû╝>]    âtâ@âCâïÆìÄ▀é╠âtâ@âCâïé≡ïƒïï
  837.     Fga    := aoiUnAssigned;            //    ga[0|1]                Åæé½ì₧é▌òsë┬æ«É½é≡û│Äï
  838.     Fgd    := aoiUnAssigned;            //    gd[0|1]                ù]ò¬é╚âfü[â^é╠ìφÅ£
  839.     Fge    := aoiUnAssigned;            //    ge[0|1]                ì┼Åëé╠ègÆúÄqé≡öFÄ»
  840.     Fgf    := aoiUnAssigned;            //    gf[0|1|2]            é╖é┼é╔éáéΘâtâ@âCâïé╠ìXÉV
  841.     Fgj    := aoiUnAssigned;            //    gj[0|1]                x û╜ù▀é≡ e û╜ù▀é╞ô»ùlé╞î⌐é╚é╖
  842.     Fgm    := aoiUnAssigned;            //    gm[0|1]                âGâëü[âüâbâZü[âWò\Īé╠ù}Ä~
  843.     Fgn    := aoiUnAssigned;            //    gn[0|1|2]            ôWèJâtâ@âCâïé╠ìçîvâTâCâYé≡ 100% é╞é╡é╜ÉiÆ╗âOâëâté╠ò\Ī
  844.     Fgo    := aoiUnAssigned;            //    go[0|1]                â_âCâAâìâOé╠âIü[âiü[âEâBâôâhâEé╠ÄwÆΦ
  845.     Fgp    := aoiUnAssigned;            //    gp[0|1]                âEâBâôâhâEé≡ Disable é╔é╡é╚éó
  846.     Fgr    := aosUnAssigned;            //    gr[<âtâ@âCâïû╝>]    ò╧ìXâtâ@âCâïû╝é≡ïƒïï
  847.     Fgs    := aoiUnAssigned;            //    gs[<âTâCâY>]        âwâbâ_îƒì⌡âTâCâYé╠ÄwÆΦ
  848.     Fgu    := aoiUnAssigned;            //    gu[0|1]                WinSFXüCDosSFX é╔æSé─é╠âtâ@âCâïé≡èiö[
  849.     Fgw    := aoiUnAssigned;            //    gw[0|1|2|3|4]        WinSFX32/WinSFX32M é≡ì∞ɼ
  850.     FUserOptions  := '';                //                            Æ╝É┌ÄwÆΦé╠âIâvâVâçâô
  851.     FUserFileList := '';                //                            Æ╝É┌ÄwÆΦé╠âtâ@âCâïâèâXâg
  852.  
  853.     FPackFilter      := pfComponent;    //    Åæî╔É╢ɼÄ₧ÄgùpâtâBâïâ^é╠ÄwÆΦ
  854.     FResFileName  := '';                //    âîâXâ|âôâXâtâ@âCâïû╝é╠ÄwÆΦ
  855.     FResFileUsage := [ruOnPack,ruOnUnpack,ruOnRemoveItem];
  856. end;
  857.  
  858. procedure TArchiverOptions.AssignTo( Dest:TPersistent );
  859. var
  860.     Dst:    TArchiverOptions;
  861. begin
  862.     if Dest is TArchiverOptions
  863.     then begin
  864.         Dst := Dest as TArchiverOptions;
  865.         Dst.Fa    := Fa;
  866.         Dst.Fc    := Fc;
  867. //        Dst.Fd    := Fd;
  868.         Dst.Fe    := Fe;
  869.         Dst.Ff    := Ff;
  870.         Dst.Fh    := Fh;
  871.         Dst.Fi    := Fi;
  872.         Dst.Fl    := Fl;
  873.         Dst.Fm    := Fm;
  874.         Dst.Fn    := Fn;
  875.         Dst.Fo    := Fo;
  876.         Dst.Fp    := Fp;
  877.         Dst.Fr    := Fr;
  878.         Dst.Fs    := Fs;
  879.         Dst.Ft    := Ft;
  880.         Dst.Fu    := Fu;
  881.         Dst.Fw    := Fw;
  882.         Dst.Fx    := Fx;
  883.         Dst.Fy    := Fy;
  884.         Dst.Fz    := Fz;
  885.         Dst.Fjc    := Fjc;
  886.         Dst.Fjd    := Fjd;
  887.         Dst.Fje    := Fje;
  888.         Dst.Fjf    := Fjf;
  889.         Dst.Fjh    := Fjh;
  890.         Dst.Fji    := Fji;
  891.         Dst.Fjm    := Fjm;
  892.         Dst.Fjn    := Fjn;
  893.         Dst.Fjo    := Fjo;
  894.         Dst.Fjob    := Fjob;
  895.         Dst.Fjp    := Fjp;
  896.         Dst.Fjr    := Fjr;
  897.         Dst.Fjsb    := Fjsb;
  898.         Dst.Fjsc    := Fjsc;
  899.         Dst.Fjsd    := Fjsd;
  900.         Dst.Fjse    := Fjse;
  901.         Dst.Fjsf    := Fjsf;
  902.         Dst.Fjsl    := Fjsl;
  903.         Dst.Fjso    := Fjso;
  904.         Dst.Fjss    := Fjss;
  905.         Dst.Fjst    := Fjst;
  906.         Dst.Fjsv    := Fjsv;
  907.         Dst.Fjsz    := Fjsz;
  908.         Dst.Fjw    := Fjw;
  909.         Dst.Fjx.Assign( Fjx );
  910.         Dst.Fjyc    := Fjyc;
  911.         Dst.Fjyd    := Fjyd;
  912.         Dst.Fjyk    := Fjyk;
  913.         Dst.Fjyn    := Fjyn;
  914.         Dst.Fjyo    := Fjyo;
  915.         Dst.Fjz    := Fjz;
  916.         Dst.Fga    := Fga;
  917.         Dst.Fgd    := Fgd;
  918.         Dst.Fge    := Fge;
  919.         Dst.Fgf    := Fgf;
  920.         Dst.Fgj    := Fgj;
  921.         Dst.Fgm    := Fgm;
  922.         Dst.Fgn    := Fgn;
  923.         Dst.Fgo    := Fgo;
  924.         Dst.Fgp    := Fgp;
  925.         Dst.Fgr    := Fgr;
  926.         Dst.Fgs    := Fgs;
  927.         Dst.Fgu    := Fgu;
  928.         Dst.Fgw    := Fgw;
  929.         Dst.FUserOptions  := FUserOptions;
  930.         Dst.FUserFileList := FUserFileList;
  931.         Dst.FPackFilter   := FPackFilter;
  932.         Dst.FResFileName  := FResFileName;
  933.         exit;
  934.     end;
  935.     inherited;
  936. end;
  937.  
  938. //---------------------------------------------------------------------
  939. constructor TArchiver.Create;
  940. begin
  941.     inherited Create;
  942.     LoadDLL;    //    âìü[âhé╖éΘé╜é▀é╞î╛éñéµéΦé═âAü[âJâCâoécékékùLû│é╠â`âFâbâNé╠é╜é▀
  943. end;
  944.  
  945. destructor    TArchiver.Destroy;
  946. begin
  947.     inherited Destroy;
  948.     //    Åêù¥ìéæ¼ë╗é╠é╜é▀ DLL é╠èJò·é═ìsé╚éφé╚éó
  949. end;
  950.  
  951. class procedure TArchiver.LoadDll;
  952. begin
  953.     raise EArchiver.Create( 'Abstract method ''TArchiver.LoadDLL'' was called' );    //    é┐éσé┴é╞âEâ\
  954. end;
  955.  
  956. class procedure TArchiver.FreeDll;
  957. begin
  958.     raise EArchiver.Create( 'Abstract method ''TArchiver.FreeDLL'' was called' );    //    é┐éσé┴é╞âEâ\
  959. end;
  960.  
  961. {$IFNDEF VER93} // not C++Builder 1 ?
  962. class procedure TArchiver.ReleaseDLL;
  963. begin
  964.     FreeDLL;
  965. end;
  966. {$ENDIF}
  967.  
  968. function  TArchiver.FindOpen( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ):THARC;
  969. begin
  970.     result := 0;    //    not opened
  971. end;
  972.  
  973. function TArchiver.FindClose( hArc:THArc ):integer;
  974. begin
  975.     result := 0;    //    nothing to do
  976. end;
  977.  
  978. function TArchiver.FindFirst( hArc:THArc;var IndivisualInfo:TIndivisualInfo;FileMask:string ):integer;
  979. begin
  980.     result := -1;    //    done
  981. end;
  982.  
  983. function TArchiver.FindNext( hArc:THArc;var IndivisualInfo:TIndivisualInfo ):integer;
  984. begin
  985.     result := -1;    //    done
  986. end;
  987.  
  988. function TArchiver.PackFiles( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:       String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer;
  989. begin
  990.     raise EArchiver.Create( 'é▒é╠î`Ä«é┼é═Åæî╔âtâ@âCâïé╠ì∞ɼé≡âTâ|ü[âgé╡é─é¿éΦé▄é╣é±üB' );
  991. end;
  992.  
  993. function TArchiver.RemoveItems( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer;
  994. begin
  995.     raise EArchiver.Create( 'é▒é╠î`Ä«é╠Åæî╔é┼é═âtâ@âCâïé╠ìφÅ£é≡âTâ|ü[âgé╡é─é¿éΦé▄é╣é±üB' );
  996. end;
  997.  
  998. function TArchiver.UpdateArchive( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer;
  999. begin
  1000.     raise EArchiver.Create( 'é▒é╠î`Ä«é╠Åæî╔é┼é═Åæî╔é╠ìXÉVé≡âTâ|ü[âgé╡é─é¿éΦé▄é╣é±üB' );
  1001. end;
  1002.  
  1003. function TArchiver.MakeSfx( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;DstPath:String;var Output:string ):Integer;
  1004. begin
  1005.     raise EArchiver.Create( 'é▒é╠î`Ä«é┼é═Ä⌐î╚ë≡ôÇÅæî╔é╠ì∞ɼé≡âTâ|ü[âgé╡é─é¿éΦé▄é╣é±üB' );
  1006. end;
  1007.  
  1008. function TArchiver.UnpackToMem( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD ):Integer;
  1009. begin
  1010.     raise EArchiver.Create( 'é▒é╠î`Ä«é┼é═âüâéâèé╓é╠ôWèJé≡âTâ|ü[âgé╡é─é¿éΦé▄é╣é±üB' );
  1011. end;
  1012.  
  1013. function TArchiver.CheckArchive( ArchiveFileName:string;CheckMode:integer;CheckOptions:integer ):DWORD;
  1014. begin
  1015.     raise EArchiver.Create( 'é▒é╠î`Ä«é┼é═Åæî╔â`âFâbâNï@ö\é≡âTâ|ü[âgé╡é─é¿éΦé▄é╣é±üB' );
  1016. end;
  1017.  
  1018. function TArchiver.SetOwnerWindowEx( Handle:HWND;lpArcProc:LPARCHIVERPROC ):boolean;
  1019. begin
  1020.     FOwnerWindow := Handle;
  1021.     result := false;
  1022. end;
  1023.  
  1024. function TArchiver.KillOwnerWindowEx( Handle:HWND ):boolean;
  1025. begin
  1026.     FOwnerWindow := 0;
  1027.     result := false;
  1028. end;
  1029.  
  1030. function TArchiver.CallBackEnabled: boolean;
  1031. begin
  1032.     result := FOwnerWindow <> 0;
  1033. end;
  1034.  
  1035. procedure TArchiver.AddFileSpec1( CmdLine:TCmdOpt;ArchiveFileName:string;path:string );
  1036. begin
  1037.     CmdLine.AddFName1( '',ArchiveFileName );
  1038.     CmdLine.AddPath1 ( '',Path );
  1039. end;
  1040.  
  1041. function TArchiver.AddFileSpec2( CmdLine:TCmdOpt;Options:TArchiverOptions;FileList:array of const;UseResFile:boolean ):integer;
  1042. begin
  1043.     if( UseResFile )and( Options.ResFileName <> aosUnassigned )and( Options.ResFileName <> '' )
  1044.     then begin
  1045.         Result := CmdLine.MakeResFile( FileList,Options.ResFileName );
  1046.     end else begin
  1047.         Result := CmdLine.AddFList2( '',FileList );
  1048.     end;
  1049.     CmdLine.Add( Options.UserFileList );
  1050. end;
  1051.  
  1052. procedure TArchiver.BeforePack;
  1053. begin
  1054.     LoadDLL;    //    DLL é╠ùLû│é≡èmöFé╖éΘ
  1055. end;
  1056.  
  1057. //---------------------------------------------------------------------
  1058. constructor TArchiveFile.Create( AOwner:TComponent );
  1059. begin
  1060.     inherited Create( AOwner );
  1061.     FOptions := TArchiverOptions.Create;
  1062.     FArchiverType := atAutoDetect;
  1063.     FFileName := aosUnAssigned;
  1064.     FArchiver := nil;
  1065.     FHArc := 0;
  1066. end;
  1067.  
  1068. destructor TArchiveFile.Destroy;
  1069. begin
  1070.     if FOwnerWindow <> 0
  1071.     then DeallocateHWnd( FOwnerWindow );
  1072.     FArchiver.Free;
  1073.     FOptions.Free;
  1074.     inherited Destroy;
  1075. end;
  1076.  
  1077. procedure TArchiveFile.CheckArchiverType;
  1078. begin
  1079.     if FArchiver=nil then raise EArchiver.Create( 'Åæî╔é╠î`Ä«é≡ö╗ò╩é┼é½é▄é╣é±üB' );
  1080. end;
  1081.  
  1082. function TArchiveFile.UnpackFiles( Handle:HWND;Options:TArchiverOptions;DstPath:String;FileList:array of const ):Integer;
  1083. begin
  1084.     try
  1085.         CheckArchiverType;
  1086.         EnableEvents;
  1087.         if Options = nil then Options := FOptions;
  1088.         result := FArchiver.UnpackFiles( Handle,FFileName,Options,DstPath,FileList,ruOnUnpack in Options.ResFileUsage,FOutputBuff );
  1089.     finally
  1090.         FCmdLine := FArchiver.CmdLine;
  1091.         DisableEvents;
  1092.     end;
  1093. end;
  1094.  
  1095. function TArchiveFile.UnpackToMem( Handle:HWND;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD ):Integer;
  1096. begin
  1097.     try
  1098.         CheckArchiverType;
  1099.         EnableEvents;
  1100.         if Options = nil then Options := FOptions;
  1101.         result := FArchiver.UnpackToMem( Handle,FFileName,Options,FileName,lpvBuffer,dwSize,lpdwWriteSize );
  1102.     finally
  1103.         FCmdLine := FArchiver.CmdLine;
  1104.         DisableEvents;
  1105.     end;
  1106. end;
  1107.  
  1108. function TArchiveFile.PackFiles( Handle:HWND;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  1109.     function DoPack( Options:TArchiverOptions;FileList:array of const ):integer;
  1110.     begin
  1111.         try
  1112.             EnableEvents;
  1113.             Result := FArchiver.PackFiles( Handle,FFileName,Options,BaseDir,FileList,ruOnPack in Options.ResFileUsage,FOutputBuff );
  1114.         finally
  1115.             FCmdLine := FArchiver.CmdLine;
  1116.             DisableEvents;
  1117.         end;
  1118.     end;
  1119. var
  1120.     TmpFileList:    TStrings;
  1121.     TmpOptions:        TArchiverOptions;
  1122.     FilterAborted:    boolean;
  1123. begin
  1124.     DetectArchiverType;
  1125.     CheckArchiverType;
  1126.     if Options = nil then Options := FOptions;
  1127.     FArchiver.BeforePack;    //    âAü[âJâCâoDLLé╠æ╢ì▌é≡èmöF
  1128.  
  1129.     if Options.PackFilter = pfComponent
  1130.     then begin
  1131.         TmpOptions  := TArchiverOptions.Create;
  1132.         TmpFileList := nil;
  1133.         try
  1134.             FilterAborted := False;
  1135.             TmpOptions.Assign( Options );
  1136.             TmpFileList := PackFileFilter( DoProgress,TmpOptions,BaseDir,FileList,FilterAborted );
  1137.             if FilterAborted
  1138.             then begin
  1139.                 Result := ERROR_USER_CANCEL;
  1140.                 exit;
  1141.             end;
  1142.             if( TmpFileList is TStrings )and( TmpFileList.Count > 0 )
  1143.             then begin
  1144.                 TmpOptions.jx.clear;
  1145.                 Result := DoPack( TmpOptions,[TmpFileList] )
  1146.             end else begin
  1147.                 if Length( FOutputBuff ) > 0 then FOutputBuff[1] := #0;
  1148.                 Result := 0;
  1149.             end;
  1150.         finally
  1151.             TmpFileList.Free;
  1152.             TmpOptions .Free;
  1153.         end;
  1154.     end else begin
  1155.         Result := DoPack( Options,FileList );
  1156.     end;
  1157.  
  1158.     FCmdLine := FArchiver.CmdLine;
  1159. end;
  1160.  
  1161. function TArchiveFile.RemoveItems( Handle:HWND;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  1162. begin
  1163.     try
  1164.         DetectArchiverType;
  1165.         CheckArchiverType;
  1166.         EnableEvents;
  1167.         if Options = nil then Options := FOptions;
  1168.         result := FArchiver.RemoveItems( Handle,FFileName,Options,BaseDir,FileList,ruOnRemoveItem in Options.ResFileUsage,FOutputBuff );
  1169.     finally
  1170.         FCmdLine := FArchiver.CmdLine;
  1171.         DisableEvents;
  1172.     end;
  1173. end;
  1174.  
  1175. function TArchiveFile.UpdateArchive( Handle:HWND;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer;
  1176. begin
  1177.     try
  1178.         DetectArchiverType;
  1179.         CheckArchiverType;
  1180.         EnableEvents;
  1181.         if Options = nil then Options := FOptions;
  1182.         result := FArchiver.UpdateArchive( Handle,FFileName,Options,BaseDir,FileList,ruOnUpdate in Options.ResFileUsage,FOutputBuff );
  1183.     finally
  1184.         FCmdLine := FArchiver.CmdLine;
  1185.         DisableEvents;
  1186.     end;
  1187. end;
  1188.  
  1189. function TArchiveFile.MakeSfx( Handle:HWND;Options:TArchiverOptions;DstPath :String ):Integer;
  1190. begin
  1191.     try
  1192.         CheckArchiverType;
  1193.         EnableEvents;
  1194.         if Options = nil then Options := FOptions;
  1195.         result := FArchiver.MakeSfx( Handle,FFileName,Options,DstPath,FOutputBuff );
  1196.     finally
  1197.         if Assigned( FArchiver )
  1198.         then begin
  1199.             FCmdLine := FArchiver.CmdLine;
  1200.         end else begin
  1201.             FCmdLine := '';
  1202.         end;
  1203.         DisableEvents;
  1204.     end;
  1205. end;
  1206.  
  1207. function TArchiveFile.CheckArchive( CheckMode:integer;CheckOptions:integer ):DWORD;
  1208. begin
  1209.     DetectArchiverType;
  1210.     CheckArchiverType;
  1211.     result := FArchiver.CheckArchive( FFileName,CheckMode,CheckOptions );
  1212. end;
  1213. {
  1214. function TArchiveFile.UnpackTo( Handle:HWND;DstPath:String;FileList:TStrings ):Integer;
  1215. begin
  1216.     result := UnpackFiles( Handle,nil,DstPath,FileList );
  1217. end;
  1218.  
  1219. function TArchiveFile.PackTo( Handle:HWND;BaseDir:String;FileList:TStrings ):Integer;
  1220. begin
  1221.     result := PackFiles( Handle,nil,BaseDir,FileList );
  1222. end;
  1223.  
  1224. function TArchiveFile.RemoveItem( Handle:HWND;BaseDir:String;FileList:TStrings ):Integer;
  1225. begin
  1226.     result := RemoveItems( Handle,nil,BaseDir,FileList );
  1227. end;
  1228.  
  1229. function TArchiveFile.MakeSfxFile( Handle:HWND;DstPath:String ):Integer;
  1230. begin
  1231.     result := MakeSfx( Handle,nil,DstPath );
  1232. end;
  1233. }
  1234. procedure TArchiveFile.DetectArchiverType;
  1235. begin
  1236.     if FArchiverType <> atAutoDetect then exit;
  1237.     SetArchiverType( Archives.DetectArchiverType( FFileName,false ));
  1238. end;
  1239.  
  1240. procedure TArchiveFile.SetFileName( ArchiveFileName:TFileName );
  1241. begin
  1242.     SetArchiverType( Archives.DetectArchiverType( ArchiveFileName,true ));
  1243.     FFileName := ArchiveFileName;
  1244. end;
  1245.  
  1246. procedure TArchiveFile.SetArchiverType( ArchiverType:TArchiverType );
  1247.     procedure SetArchiver( Archiver:TArchiver );
  1248.     begin
  1249.         FArchiver.Free;
  1250.         FArchiver := Archiver;
  1251.     end;
  1252. begin
  1253.     if not( csDesigning in ComponentState )
  1254.     then begin
  1255.         case ArchiverType of
  1256.             atLha:
  1257.                 SetArchiver( TLha32.Create );
  1258.             atZip:
  1259.                 SetArchiver( TZip32.Create );
  1260.             atCab:
  1261.                 SetArchiver( TCab32.Create );
  1262.             atArj:
  1263.                 SetArchiver( TArj32.Create );
  1264.             atTar:
  1265.                 SetArchiver( TTar32.Create );
  1266.             atTgz:
  1267.                 SetArchiver( TTgz32.Create );
  1268.             atBZ2:
  1269.                 SetArchiver( TBZ232.Create );
  1270.             atRar:
  1271.                 SetArchiver( TRar32.Create );
  1272.             atBga:
  1273.                 SetArchiver( TBGA32.Create );
  1274. {$IFDEF USEGCA}
  1275.             atGca:
  1276.                 SetArchiver( TGCA32.Create );
  1277. {$ENDIF}
  1278. {$IFDEF USEBEL}
  1279.             atBel:
  1280.                 SetArchiver( TBel32.Create );
  1281. {$ENDIF}
  1282. {$IFDEF USEYZ1}
  1283.             atYz1:
  1284.                 SetArchiver( TYZ1.Create );
  1285. {$ENDIF}
  1286.             atAutoDetect:    //    éáé╞é┼É▌ÆΦé╖éΘ
  1287.                 ;
  1288.             atNone:            //    ò╧ìXé╡é╚éó
  1289.                 exit;
  1290.             else
  1291.                 if not ( csReading in ComponentState )
  1292.                 then raise EArchiver.Create( 'Åæî╔é╠î`Ä«é≡ô┴ÆΦé┼é½é▄é╣é±é┼é╡é╜üB' );
  1293.         end;
  1294.     end;
  1295.     FArchiverType := ArchiverType;
  1296. end;
  1297.  
  1298. function TArchiveFile.FindOpen( Handle:HWND;dwMode:DWORD ):integer;
  1299. begin
  1300.     DetectArchiverType;
  1301.     CheckArchiverType;
  1302.     FHArc := FArchiver.FindOpen( Handle,FFileName,dwMode );
  1303.     if FHArc = 0 then Result := 1 else Result := 0;
  1304. end;
  1305.  
  1306. function TArchiveFile.FindClose:integer;
  1307. begin
  1308.     Result := FArchiver.FindClose( FHArc );
  1309.     FHArc := 0;
  1310. end;
  1311.  
  1312. function TArchiveFile.FindFirst( FileMask:string;var IndivisualInfo:TIndivisualInfo ):integer;
  1313. begin
  1314.     result := FArchiver.FindFirst( FHArc,IndivisualInfo,FileMask );
  1315. end;
  1316.  
  1317. function TArchiveFile.FindNext( var IndivisualInfo:TIndivisualInfo ):integer;
  1318. begin
  1319.     result := FArchiver.FindNext( FHArc,IndivisualInfo );
  1320. end;
  1321.  
  1322. procedure TArchiveFile.SetOutputSize( OutputSize:integer );
  1323. begin
  1324.     SetLength( FOutputBuff,OutputSize );    //    Åoù═âüâbâZü[âWé≡èiö[é╖éΘâoâbâtâ@
  1325.     if OutputSize > 0 then FOutputBuff[1] := #0;
  1326. //    FOutputSize := OutputSize;                    //    Åoù═âüâbâZü[âWâoâbâtâ@é╠âTâCâY
  1327. end;
  1328.  
  1329. function TArchiveFile.GetOutputSize:integer;
  1330. begin
  1331.     result := Length( FOutputBuff );
  1332. end;
  1333.  
  1334. function TArchiveFile.GetOutput:string;
  1335. begin
  1336.     result := FOutputBuff;
  1337. end;
  1338.  
  1339. //-----------------------------------------------------------------------------------------
  1340. procedure TArchiveFile.ArchiverWndProc( var Message:TMessage );
  1341. var
  1342.     State:    UINT;
  1343.     lpEis:    LPExtractingInfoEx;
  1344.     Abort:    boolean;
  1345. begin
  1346.     if Message.Msg = WM_ARCEXTRACT
  1347.     then begin
  1348.         State := Message.wParam;
  1349.         lpEis := LPExtractingInfoEx( Message.lParam );
  1350.         Abort := False;
  1351.         DoProgress( State,lpEis,Abort );
  1352.         if Abort
  1353.         then Message.Result := 1    //    Åêù¥ÆåÄ~
  1354.         else Message.Result := 0;    //    Åêù¥æ▒ìs
  1355.     end else begin
  1356.         Message.Result := DefWindowProc( FOwnerWindow,Message.Msg,Message.wParam,Message.lParam );
  1357.     end;
  1358. end;
  1359.  
  1360. procedure TArchiveFile.DoProgress( State:UINT;lpEis:LPExtractingInfoEx;var Abort:boolean );
  1361. begin
  1362.     if Assigned( FOnProgress )
  1363.     then begin
  1364.         FOnProgress( Self,State,lpEis,Abort );
  1365.     end;
  1366. end;
  1367.  
  1368. procedure TArchiveFile.EnableEvents;
  1369. begin
  1370.     if not Assigned( FOnProgress ) then exit;
  1371.  
  1372.     if WM_ARCEXTRACT = 0
  1373.     then WM_ARCEXTRACT := RegisterWindowMessage( lpszWMARCEXTRACT );
  1374.  
  1375.     if FOwnerWindow = 0
  1376.     then FOwnerWindow := AllocateHWnd( ArchiverWndProc );
  1377.  
  1378.     try
  1379.         FArchiver.SetOwnerWindowEx( FOwnerWindow,nil );
  1380.     except
  1381.         ;
  1382.     end;
  1383. end;
  1384.  
  1385. procedure TArchiveFile.DisableEvents;
  1386. begin
  1387.     if not Assigned( FOnProgress ) then exit;
  1388.  
  1389.     try
  1390.         FArchiver.KillOwnerWindowEx( FOwnerWindow );
  1391.     except
  1392.         ;
  1393.     end;
  1394. end;
  1395.  
  1396. //-----------------------------------------------------------------------------------------
  1397. constructor TCmdOpt.Create;
  1398. begin
  1399.     FCmdLine := '';
  1400.     FFormat  := cfInner;
  1401. end;
  1402.  
  1403. procedure TCmdOpt.Add( optstr:string );
  1404. begin
  1405.     FCmdLine := FCmdLine + ' ' + OptStr;
  1406. end;
  1407.  
  1408. procedure TCmdOpt.AddStrOpt( optstr:string;value:string );
  1409. begin
  1410.     if value = aosUnAssigned then exit;
  1411.  
  1412.     if optstr = ''
  1413.     then begin
  1414.         Add( '"' + value + '"' );
  1415.     end else begin
  1416.         if optstr[1] = ' '
  1417.         then begin
  1418.             optstr := copy( optstr,2,MaxInt );
  1419.         end else begin
  1420.             optstr := '-'+optstr;
  1421.         end;
  1422.         if FFormat = cfInner
  1423.         then begin
  1424.             Add( '"' + optstr + value + '"' );
  1425.         end else begin
  1426.             Add( optstr + ' "' + value + '"' );
  1427.         end;
  1428.     end;
  1429. end;
  1430.  
  1431. procedure TCmdOpt.AddIntOpt( optstr:string;value:integer );
  1432. begin
  1433.     if value > aoiUnAssigned
  1434.     then Add( '-'+optstr+IntToStr( value ));
  1435. end;
  1436.  
  1437. procedure TCmdOpt.AddIntDef( optstr:string;value:integer;defaultopt:integer );
  1438. begin
  1439.     if value <> aoiUnAssigned
  1440.     then begin
  1441.         if value = defaultopt
  1442.         then begin
  1443.             Add( '-'+optstr );
  1444.         end else begin
  1445.             Add( '-'+optstr+IntToStr( value ));
  1446.         end;
  1447.     end;
  1448. end;
  1449.  
  1450. procedure TCmdOpt.AddBolOpt( optstr:string;value:boolean );
  1451. begin
  1452.     if( value )
  1453.     then Add( '-'+optstr );
  1454. end;
  1455.  
  1456. procedure TCmdOpt.AddFName1( optstr,filespec:string );
  1457. begin
  1458.     AddStrOpt( optstr,filespec );
  1459. end;
  1460.  
  1461. procedure TCmdOpt.AddPath1( optstr,pathspec:string );
  1462. begin
  1463.     if pathspec = '' then exit;
  1464.     if pathspec = aosUnAssigned then exit;
  1465.     if AnsiLastChar( pathspec ) <> '\'
  1466.     then AddFName1( optstr,pathspec+'\' )
  1467.     else AddFName1( optstr,pathspec );
  1468. end;
  1469.  
  1470. procedure TCmdOpt.AddFName2( optstr,filespec:string );
  1471. begin
  1472.     AddFName1( optstr,Filtered( filespec ));
  1473. end;
  1474.  
  1475. function ArrayToList( FileList:array of const ):TStringList;
  1476.     procedure AddResult( FileName:string );
  1477.     begin
  1478.         if FileName='' then exit;
  1479.         Result.Add( FileName );
  1480.     end;
  1481. var
  1482.     aFileList:    TStrings;
  1483.     PFileList:    ^PChar;
  1484.     i:                integer;
  1485.     j:                integer;
  1486. begin
  1487.     Result := TStringList.Create;
  1488.     for j := Low( FileList ) to High( FileList ) do begin
  1489.         with FileList[j] do begin
  1490.             case VType of
  1491.                 vtObject:
  1492.                     if VObject is TStrings
  1493.                     then begin
  1494.                         aFileList := VObject as TStrings;
  1495.                         for i := 0 to aFileList.Count-1 do begin
  1496.                             AddResult( aFileList[i] );
  1497.                         end;
  1498.                     end;
  1499.                 vtPointer:
  1500.                     if VPointer <> nil
  1501.                     then begin
  1502.                         PFileList := VPointer;
  1503.                         while PFileList^ <> nil do begin
  1504.                             AddResult( PFileList^ );
  1505.                             Inc( PFileList );
  1506.                         end;
  1507.                     end;
  1508.                 vtPChar:
  1509.                     AddResult( VPChar );
  1510.                 vtString:
  1511.                     AddResult( VString^ );
  1512.                 vtAnsiString:
  1513.                     AddResult( string( VAnsiString ));
  1514. {$IFNDEF VER90}    //    not Delphi 2 ?
  1515.                 vtWideString:
  1516.                     AddResult( string( VWideString ));
  1517. {$ENDIF}
  1518.                 vtVariant:
  1519.                     if VarIsArray( VVariant^ )
  1520.                     then begin
  1521.                         for i := VarArrayLowBound( VVariant^,1 ) to VarArrayHighBound( VVariant^,1 ) do begin
  1522.                             AddResult( VVariant^[i] );
  1523.                         end;
  1524.                     end else begin
  1525.                         AddResult( string( VVariant^ ));
  1526.                     end;
  1527.             end;
  1528.         end;
  1529.     end;
  1530. end;
  1531.  
  1532. function TCmdOpt.AddFList2( optstr:string;FileList:array of const ):integer;
  1533. var
  1534.     FileList2:    TStringList;
  1535.     i:                integer;
  1536. begin
  1537.     FileList2 := ArrayToList( FileList );
  1538.     try
  1539.         for i := 0 to FileList2.Count-1 do begin
  1540.             AddFName2( optstr,FileList2[i] );
  1541.         end;
  1542.         Result := FileList2.Count;
  1543.     finally
  1544.         FileList2.Free;
  1545.     end;
  1546. end;
  1547.  
  1548. function TCmdOpt.Filtered( S:string ):string;
  1549. begin
  1550.     if Assigned( FFilterProc )
  1551.     then Result := FFilterProc( S )
  1552.     else Result :=              S;
  1553. end;
  1554.  
  1555. function TCmdOpt.MakeResFile( FileList:array of const;ResFileName:string ):integer;
  1556. var
  1557.     FileList2:    TStringList;
  1558.     Stream:        TStream;
  1559.     S:                string;
  1560.     i:                integer;
  1561. begin
  1562.     FileList2 := ArrayToList( FileList );
  1563.     Stream := TFileStream.Create( ResFileName,fmCreate );
  1564.     try
  1565.         for i:=0 to FileList2.Count-1 do begin
  1566.             S := S + '"' + Filtered( FileList2[i] ) + '"'#13#10
  1567.         end;
  1568.         Stream.WriteBuffer( PChar( S )^,Length( S ));
  1569.         Result := FileList2.Count;
  1570.     finally
  1571.         FileList2.Free;
  1572.         Stream.Free;
  1573.     end;
  1574.     AddFName1( '','@'+ResFileName )
  1575. end;
  1576.  
  1577. //-----------------------------------------------------------------------------------------
  1578. function DetectArchiverType( ArchiveFileName:string;DetectByFileExt:boolean ):TArchiverType;
  1579. var
  1580.     FileExt:    string;
  1581. begin
  1582.     result := atNone;
  1583.     if DetectByFileExt    //    ègÆúÄqé┼ö╗Æf
  1584.     then begin
  1585.         FileExt := ExtractFileExt( ArchiveFileName );
  1586.         if CompareText( FileExt,   '.z' )=0 then result := atTgz;
  1587.         if CompareText( FileExt,  '.gz' )=0 then result := atTgz;
  1588.         if CompareText( FileExt, '.tgz' )=0 then result := atTgz;
  1589.         if CompareText( FileExt, '.taz' )=0 then result := atTgz;
  1590.         if CompareText( FileExt,   '.a' )=0 then result := atTar;
  1591.         if CompareText( FileExt, '.lib' )=0 then result := atTar;
  1592.         if CompareText( FileExt, '.tar' )=0 then result := atTar;
  1593.         if CompareText( FileExt, '.deb' )=0 then result := atTar;
  1594.         if CompareText( FileExt, '.rpm' )=0 then result := atTar;
  1595.         if CompareText( FileExt,'.cpio' )=0 then result := atTar;
  1596.         if CompareText( FileExt, '.bz2' )=0 then result := atBZ2;
  1597.         if CompareText( FileExt, '.gza' )=0 then result := atBga;
  1598.         if CompareText( FileExt, '.bza' )=0 then result := atBga;
  1599.         if CompareText( FileExt, '.gca' )=0 then result := atGCA;
  1600. {$IFDEF USEYZ1}
  1601.         if CompareText( FileExt, '.yz1' )=0 then result := atYz1;
  1602. {$ENDIF}
  1603. {$IFDEF USEBEL}
  1604.         if CompareText( FileExt, '.bel' )=0 then result := atBel;
  1605. {$ENDIF}
  1606.         if CompareText( FileExt, '.rar' )=0 then result := atRar;
  1607.         if CompareText( FileExt, '.arj' )=0 then result := atArj;
  1608.         if CompareText( FileExt, '.zip' )=0 then result := atZip;
  1609.         if CompareText( FileExt, '.cab' )=0 then result := atCab;
  1610.         if CompareText( FileExt, '.lzh' )=0 then result := atLha;
  1611.         if CompareText( FileExt, '.exe' )=0 then result := DetectArchiverType( ArchiveFileName,false );
  1612.     end else begin
  1613.         result := IsTarArchive( ArchiveFileName );
  1614.         if IsRarArchive( ArchiveFileName )    then result := atRar;
  1615.         if IsArjArchive( ArchiveFileName )    then result := atArj;
  1616.         if IsZipArchive( ArchiveFileName )    then result := atZip;
  1617.         if IsBgaArchive( ArchiveFileName )    then result := atBga;
  1618. {$IFDEF USEYZ1}
  1619.         if IsYz1Archive( ArchiveFileName )    then result := atYz1;
  1620. {$ENDIF}
  1621.         if IsCabArchive( ArchiveFileName )    then result := atCab;
  1622.         if IsLhaArchive( ArchiveFileName )    then result := atLha;
  1623.     end;
  1624. end;
  1625.  
  1626. function GetProcAddr( var EntryPoint:FARPROC;hModule:HMODULE;lpszProcName:string;RaiseException:boolean ):boolean;
  1627. var
  1628.     szDllName:    array[0..256] of Char;
  1629. begin
  1630.     result := true;
  1631.     if EntryPoint <> nil then exit;
  1632.     EntryPoint := GetProcAddress( hModule,PChar( lpszProcName ));
  1633.     if EntryPoint <> nil then exit;
  1634.     GetModuleFileName( hModule,szDllName,sizeof( szDllName ));
  1635.     if RaiseException then raise EEntryNotFound.Create( Format( '%0:s é╔ %1:s é╠âGâôâgâèé¬î⌐é┬é⌐éΦé▄é╣é±üB',[szDllName,lpszProcName] ));
  1636.     result := false;
  1637. end;
  1638.  
  1639. //--------------------------------------------------------------------------
  1640. constructor TCustomArchiverDll.Create;
  1641. begin
  1642.     //    ë╜éαé╡é╚éó
  1643. end;
  1644.  
  1645. destructor TCustomArchiverDll.Destroy;
  1646. begin
  1647.     FreeDLL;
  1648. end;
  1649.  
  1650. procedure TCustomArchiverDll.FreeDll;
  1651. begin
  1652.     FArchiverProc      := nil;
  1653.     FOpenArchive       := nil;
  1654.     FCloseArchive      := nil;
  1655.     FFindFirst         := nil;
  1656.     FFindNext          := nil;
  1657.     FExtractMem        := nil;
  1658.     FCheckArchive      := nil;
  1659.     FSetOwnerWindowEx  := nil;
  1660.     FKillOwnerWindowEx := nil;
  1661.     FGetWriteTimeEx    := nil;
  1662.     FGetCreateTimeEx   := nil;
  1663.     FGetAccessTimeEx   := nil;
  1664.     FGetArchiveType    := nil;
  1665. end;
  1666.  
  1667. function TCustomArchiverDll.ArchiverProc( _hwnd:HWND;_lpszCmdLine:PAnsiChar;_lpszOutput:PAnsiChar;_dwSize:DWORD ):integer;
  1668. begin
  1669.     if _dwSize = 0 then _lpszOutput := nil;
  1670.     result := TArcDLLArchiverProc( FArchiverProc )( _hwnd,_lpszCmdLine,_lpszOutput,_dwSize );
  1671. end;
  1672.  
  1673. function TCustomArchiverDll.OpenArchive( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ):THARC;
  1674. begin
  1675.     result := TArcDLLFindOpen( FOpenArchive )( Handle,PAnsiChar( ArchiveFileName ),dwMode );
  1676. end;
  1677.  
  1678. function TCustomArchiverDll.CloseArchive( hArc:THARC ):integer;
  1679. begin
  1680.     result := TArcDLLFindClose( FCloseArchive )( hArc );
  1681. end;
  1682.  
  1683. function TCustomArchiverDll.FindFirst( hArc:THArc;FileMask:string;IndivisualInfo:PIndivisualInfo ):integer;
  1684. begin
  1685.     result := TArcDLLFindFirst( FFindFirst )( hArc,PAnsiChar( FileMask ),IndivisualInfo );
  1686.     if result = 0 then GetAddtitionalInfo( hArc,IndivisualInfo );
  1687. end;
  1688.  
  1689. function TCustomArchiverDll.FindNext( hArc:THArc;IndivisualInfo:PIndivisualInfo ):integer;
  1690. begin
  1691.     result := TArcDLLFindNext( FFindNext )( hArc,IndivisualInfo );
  1692.     if result = 0 then GetAddtitionalInfo( hArc,IndivisualInfo );
  1693. end;
  1694.  
  1695. procedure TCustomArchiverDll.GetAddtitionalInfo( hArc:THArc;IndivisualInfo:PIndivisualInfo );
  1696. begin
  1697.     with IndivisualInfo^ do begin
  1698.         if  GetWriteTimeEx( hArc,WriteTime  ) = False then DosDateTimeToFileTime( wDate,wTime,WriteTime  );
  1699.         if GetAccessTimeEx( hArc,AccessTime ) = False then DosDateTimeToFileTime( wDate,wTime,AccessTime );
  1700.         if GetCreateTimeEx( hArc,CreateTime ) = False then DosDateTimeToFileTime( wDate,wTime,CreateTime );
  1701.     end;
  1702. end;
  1703.  
  1704. function TCustomArchiverDll.CheckArchive( lpszFileName:PAnsiChar;iMode:integer ):DWORD;
  1705. begin
  1706.     result := TArcDLLCheckArchive( FCheckArchive )( lpszFileName,iMode );
  1707. end;
  1708.  
  1709. function TCustomArchiverDll.SetOwnerWindowEx( Handle:HWND;lpArcProc:LPARCHIVERPROC ):BOOL;
  1710. begin
  1711.     result := TArcDLLSetOwnerWindowEx( FSetOwnerWindowEx )( Handle,lpArcProc );
  1712. end;
  1713.  
  1714. function TCustomArchiverDll.KillOwnerWindowEx( Handle:HWND ):BOOL;
  1715. begin
  1716.     result := TArcDLLKillOwnerWindowEx( FKillOwnerWindowEx )( Handle );
  1717. end;
  1718.  
  1719. function TCustomArchiverDll.ExtractMem( Handle:HWND;lpszCmdLine:PAnsiChar;lpvBuffer:LPBYTE;dwSize:DWORD;lpTime:ptime_t;lpwAttr:LPWORD;lpdwWriteSize:LPDWORD ):integer;
  1720. begin
  1721.     result := TArcDLLExtractMem( FExtractMem )( Handle,lpszCmdLine,lpvBuffer,dwSize,lpTime,lpwAttr,lpdwWriteSize );
  1722. end;
  1723.  
  1724. function CallGetTimeEx( hArc:THArc;GetTimeProc:TArcDLLGetFileTimeEx;var lpFileTime:TFileTime ):BOOL;
  1725. begin
  1726.     if Assigned( GetTimeProc )
  1727.     then result := GetTimeProc( hArc,lpFileTime )
  1728.     else result := false;
  1729. end;
  1730.  
  1731. function TCustomArchiverDll.GetWriteTimeEx( hArc:THArc;var lpLastWriteTime:TFileTime ):BOOL;
  1732. begin
  1733.     result := CallGetTimeEx( hArc,FGetWriteTimeEx,lpLastWriteTime );
  1734. end;
  1735.  
  1736. function TCustomArchiverDll.GetCreateTimeEx( hArc:THArc;var lpCreateTime:TFileTime ):BOOL;
  1737. begin
  1738.     result := CallGetTimeEx( hArc,FGetCreateTimeEx,lpCreateTime );
  1739. end;
  1740.  
  1741. function TCustomArchiverDll.GetAccessTimeEx( hArc:THArc;var lpAccessTime:TFileTime ):BOOL;
  1742. begin
  1743.     result := CallGetTimeEx( hArc,FGetAccessTimeEx,lpAccessTime );
  1744. end;
  1745.  
  1746. function TCustomArchiverDll.GetArchiveType( lpszFileName:PAnsiChar ):integer;
  1747. begin
  1748.     result := TTarDLLGetArchiveType( FGetArchiveType )( lpszFileName );
  1749. end;
  1750.  
  1751. //-----------------------------------------
  1752. constructor TArchiverDll.Create( ArchiveName,DllName,EntryPrefix:string );
  1753. begin
  1754.     inherited Create;
  1755.     FArchiveName := ArchiveName;
  1756.     FDllName     := DllName;
  1757.     FEntryPrefix := EntryPrefix;
  1758. end;
  1759.  
  1760. destructor TArchiverDll.Destroy;
  1761. begin
  1762.     FreeDLL;
  1763. end;
  1764.  
  1765. procedure TArchiverDll.LoadDll;
  1766. begin
  1767.     if FhDLL =  0 then FhDLL := Loadlibrary( PChar( FDllName ));
  1768.     if FhDLL <> 0 then exit;
  1769.     raise ENoArchiverDLL.Create( Format( '%0:s é≡ê╡éñé╔é═ %1:s é¬ òKùvé┼é╖üB',[FArchiveName,FDLLName] ));
  1770. end;
  1771.  
  1772. procedure TArchiverDll.FreeDll;
  1773. begin
  1774.     inherited;
  1775.     if FhDLL = 0 then exit;
  1776.     FreeLibrary( FhDLL );
  1777.     FhDLL := 0;
  1778. end;
  1779.  
  1780. function TArchiverDll.ArchiverProc( _hwnd:HWND;_lpszCmdLine:PAnsiChar;_lpszOutput:PAnsiChar;_dwSize:DWORD ):integer;
  1781. begin
  1782.     LoadDll;
  1783.     GetProcAddr( FArchiverProc,FhDLL,FEntryPrefix,true );
  1784.     result := inherited ArchiverProc( _hwnd,_lpszCmdLine,_lpszOutput,_dwSize );
  1785. end;
  1786.  
  1787. function TArchiverDll.OpenArchive( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ):THARC;
  1788. begin
  1789.     LoadDll;
  1790.     GetProcAddr( FOpenArchive,FhDLL,FEntryPrefix+'OpenArchive',true );
  1791.     result := inherited OpenArchive( Handle,PAnsiChar( ArchiveFileName ),dwMode );
  1792. end;
  1793.  
  1794. function TArchiverDll.CloseArchive( hArc:THARC ):integer;
  1795. begin
  1796.     LoadDll;
  1797.     GetProcAddr( FCloseArchive,FhDLL,FEntryPrefix+'CloseArchive',true );
  1798.     result := inherited CloseArchive( hArc );
  1799. end;
  1800.  
  1801. function TArchiverDll.FindFirst( hArc:THArc;FileMask:string;IndivisualInfo:PIndivisualInfo ):integer;
  1802. begin
  1803.     LoadDll;
  1804.     GetProcAddr( FFindFirst,FhDLL,FEntryPrefix+'FindFirst',true );
  1805.     result := inherited FindFirst( hArc,PAnsiChar( FileMask ),IndivisualInfo );
  1806. end;
  1807.  
  1808. function TArchiverDll.FindNext( hArc:THArc;IndivisualInfo:PIndivisualInfo ):integer;
  1809. begin
  1810.     GetProcAddr( FFindNext,FhDLL,FEntryPrefix+'FindNext',true );
  1811.     result := inherited FindNext( hArc,IndivisualInfo );
  1812. end;
  1813.  
  1814. function TArchiverDll.CheckArchive( lpszFileName:PAnsiChar;iMode:integer ):DWORD;
  1815. begin
  1816.     LoadDll;
  1817.     GetProcAddr( FCheckArchive,FhDLL,FEntryPrefix+'CheckArchive',true );
  1818.     result := inherited CheckArchive( lpszFileName,iMode );
  1819. end;
  1820.  
  1821. function TArchiverDll.SetOwnerWindowEx( Handle:HWND;lpArcProc:LPARCHIVERPROC ):BOOL;
  1822. begin
  1823.     GetProcAddr( FSetOwnerWindowEx,FhDLL,FEntryPrefix+'SetOwnerWindowEx',true );
  1824.     result := inherited SetOwnerWindowEx( Handle,lpArcProc );
  1825. end;
  1826.  
  1827. function TArchiverDll.KillOwnerWindowEx( Handle:HWND ):BOOL;
  1828. begin
  1829.     GetProcAddr( FKillOwnerWindowEx,FhDLL,FEntryPrefix+'KillOwnerWindowEx',true );
  1830.     result := inherited KillOwnerWindowEx( Handle );
  1831. end;
  1832.  
  1833. function TArchiverDll.ExtractMem( Handle:HWND;lpszCmdLine:PAnsiChar;lpvBuffer:LPBYTE;dwSize:DWORD;lpTime:ptime_t;lpwAttr:LPWORD;lpdwWriteSize:LPDWORD ):integer;
  1834. begin
  1835.     GetProcAddr( FExtractMem,FhDLL,FEntryPrefix+'ExtractMem',true );
  1836.     result := inherited ExtractMem( Handle,lpszCmdLine,lpvBuffer,dwSize,lpTime,lpwAttr,lpdwWriteSize );
  1837. end;
  1838.  
  1839. function TArchiverDll.GetWriteTimeEx( hArc:THArc;var lpLastWriteTime:TFileTime ):BOOL;
  1840. begin
  1841.     GetProcAddr( FGetWriteTimeEx,FhDLL,FEntryPrefix+'GetWriteTimeEx',false );
  1842.     result := inherited GetWriteTimeEx( hArc,lpLastWriteTime );
  1843. end;
  1844.  
  1845. function TArchiverDll.GetCreateTimeEx( hArc:THArc;var lpCreateTime:TFileTime ):BOOL;
  1846. begin
  1847.     GetProcAddr( FGetCreateTimeEx,FhDLL,FEntryPrefix+'GetCreateTimeEx',false );
  1848.     result := inherited GetCreateTimeEx( hArc,lpCreateTime );
  1849. end;
  1850.  
  1851. function TArchiverDll.GetAccessTimeEx( hArc:THArc;var lpAccessTime:TFileTime ):BOOL;
  1852. begin
  1853.     GetProcAddr( FGetAccessTimeEx,FhDLL,FEntryPrefix+'GetAccessTimeEx',false );
  1854.     result := inherited GetAccessTimeEx( hArc,lpAccessTime );
  1855. end;
  1856.  
  1857. function TArchiverDll.GetArchiveType( lpszFileName:PAnsiChar ):integer;
  1858. begin
  1859.     LoadDll;
  1860.     GetProcAddr( FGetArchiveType,FhDLL,FEntryPrefix+'GetArchiveType',true );
  1861.     result := inherited GetArchiveType( lpszFileName );
  1862. end;
  1863.  
  1864. //--------------------------------------------------------------------------
  1865. procedure ReleaseArchiverDLL;
  1866. begin
  1867.     TLha32.ReleaseDLL;    //    Æ╝É┌ FreeDLL é≡Ägéñé╞îδô«ì∞é╖éΘ
  1868.     TZip32.ReleaseDLL;
  1869.     TCab32.ReleaseDLL;
  1870.     TTar32.ReleaseDLL;
  1871.     TRar32.ReleaseDLL;
  1872.     TArj32.ReleaseDLL;
  1873.     TBga32.ReleaseDLL;
  1874. {$IFDEF USEGCA}
  1875.     TGca32.ReleaseDLL;
  1876. {$ENDIF}
  1877. {$IFDEF USEYZ1}
  1878.     TYz1  .ReleaseDLL;
  1879. {$ENDIF}
  1880. {$IFDEF USEBEL}
  1881.     TBel32.ReleaseDLL;
  1882. {$ENDIF}
  1883. end;
  1884.  
  1885. //--------------------------------------------------------------------------
  1886. function ArchiverErrorMsg( ArchiverResult:integer ):string;
  1887. begin
  1888.     result := LoadStr( ArchiverResult + $6000 );
  1889.     if result <> ''    then exit;
  1890.     result := Format( 'ArchiverError %d occured.',[ArchiverResult] );
  1891. end;
  1892.  
  1893. function ArchiverCheck( ArchiverResult:integer ):integer;
  1894. var
  1895.     Error:    EArchiver;
  1896. begin
  1897.     Result := ArchiverResult;
  1898.     if ArchiverResult > $8000
  1899.     then begin
  1900.         Error := EArchiver.Create( ArchiverErrorMsg( ArchiverResult ));
  1901.         Error.ErrorCode := ArchiverResult;
  1902.         raise Error;
  1903.     end;
  1904. end;
  1905.  
  1906. //--------------------------------------------------------------------------
  1907. procedure Register;
  1908. begin
  1909.     RegisterComponents( 'NORG',[TArchiveFile] );
  1910. end;
  1911.  
  1912. end.
  1913.