home *** CD-ROM | disk | FTP | other *** search
Wrap
// ô¥ìçâAü[âJâCâoâRâôâ|ü[âlâôâg for Delphi/C++Builder // Common Archivers Component for Delphi/C++Builder // Copyright(C) NORG1964/Masashi Yoneda 1997-2001 // // èεû{âéâWâàü[âï ARCHIVES.PAS // // v1.00:Åëè·î÷èJâoü[âWâçâô // v1.01:Open/Close âüâ\âbâhé≡ FindOpen/FindClose é╔ëⁿû╝ // v1.02:LHA32/ARJ32 âåâjâbâgé╠ uses É▀é⌐éτòsÄgùpâåâjâbâg Forms é≡èOé╡é╜ // âtâ@âCâïâèâXâgâpâëâüü[â^é╠î^é≡ TStrings é╔ò╧ìX // â^âCâgâïé╠âRâüâôâgé≡Äßè▒ò╧ìX // v1.03:LMZIP32é╓é╠æ╬ë₧üFêΩùùĵô╛é¬ë┬ö\é╔ // Delphi 3 é╔æ╬ë₧ // v1.04:LMZIP32é╓é╠æ╬ë₧üFÅæî╔é╠ì∞ɼé¬ë┬ö\é╔ // v1.05:Åæî╔ôαâAâCâeâÇìφÅ£ùpâüâ\âbâhÆ╟ë┴ // v1.06:Åæî╔æÇì∞âüâ\âbâhé╠û▀éΦÆlé¬òsÉ│é╛é┴é╜òsï∩ìçé╠æ╬ì⌠ // w âIâvâVâçâôé╠î^é╠îδéΦé≡ÅCÉ│ // âGâëü[ÆΦÉöé╠ÆΦï`é≡Æ╟ë┴ // v1.07:éóé┬é╠è╘é╔é⌐âCâôâXâgü[âïï@ö\é¬Ä╕éφéΩé─éóé╜é╠é≡ÅCÉ│ // v1.08:âtâ@âCâïû╝ü^âpâXû╝âIâvâVâçâôÉ╢ɼé╠òsï∩ìçæ╬ì⌠ // v1.09:Update/ExtractTo âüâ\âbâhé≡ PackTo/UnpackTo é╔ëⁿû╝ // CAB/ZIPî`Ä«Åæî╔ùpé╠Åêù¥é╔îoë▀â_âCâAâìâOö±ò\ĪâIâvâVâçâôé≡Ä└æò // CAB/ZIPî`Ä«Åæî╔ùpé╠âRâ}âôâhâëâCâôÉ╢ɼé╠òsï∩ìçé≡ÅCÉ│ // v1.10:TAR32.DLL é╔æ╬ë₧üFÅæî╔é╠ì∞ɼüEë≡ôÇüEêΩùùĵô╛é¬ë┬ö\é╔ // v1.11:èeâNâëâXé╠âüâ\âbâhÉΘî╛é╠îδéΦé≡Æ∙É│ // TArchiver é╔ MakeSfx é╠âfâtâHâïâgâüâ\âbâhé≡Æ╟ë┴ // òsùvò╧Éöé╠ÉΘî╛é≡ìφÅ£ // v1.12:TArchiveFile é╔ Output/OutputSize âvâìâpâeâBé≡Æ╟ë┴ // tgz/zip î`Ä«é╠ê│ÅkâîâxâïâIâvâVâçâô( jm )é≡Ä└æò // tar ïNô«îπé╔Ä⌐ò¬é╔âtâHü[âJâXé≡û▀é╖Åêù¥é≡Æ╟ë┴ // zip î`Ä«Åæî╔é┼é╠ RemoveItem ï@ö\âTâ|ü[âg // ôαòöâüâ\âbâhé╠Ä└æòé≡Äßè▒ò╧ìX // v1.13:TArchiveFile é≡âtâHü[âÇé╔ô\éΦé┬é»é─Ägùpé╖éΘì█é╠âìü[âhâGâëü[ë±ö≡ // UNZIP32.DLL é¬æ╢ì▌é╡é─éα ZIP Åæî╔é¬ë≡ôÇé┼é½é╚é⌐é┴é╜òsï∩ìçé╠ÅCÉ│ // âvâìâpâeâBé╠ÉΘî╛é╔ default/nodefault âIâvâVâçâôé≡é┬é»é╜ // TArchiver é╔ PackTo é╠âfâtâHâïâgâüâ\âbâhé≡Æ╟ë┴ // gr âIâvâVâçâôé╠î^é╠îδéΦé≡ÅCÉ│ // ôαòöâüâ\âbâhé╠Ä└æòé≡Äßè▒ò╧ìX // v1.14:TGZ é╠Ä⌐î╚ë≡ôÇî`Ä«ì∞ɼï@ö\âTâ|ü[âgèJÄnü|TAR32.DLL 0.31 ê╚ì~é¬òKùv // BZ2 î`Ä«Åæî╔é╠âTâ|ü[âgèJÄnü|TAR32.DLL 0.40 ê╚ì~é¬òKùv // v1.15:âtâ@âCâïâtâBâïâ^ü[ï@ö\âTâ|ü[âgì∞ï╞èJÄn // ZIP32J é┼é╠ê│ÅkâîâxâïâIâvâVâçâôÉ╢ɼé╠îδéΦé≡Æ∙É│ // v1.16:CAB î`Ä«é┼é╠ r âIâvâVâçâôÅêù¥é≡Ä└æò // Åæî╔ì∞ɼÄ₧é╔Ä⌐æOé┼âtâ@âCâïâèâXâgé≡É╢ɼé╖éΘï@ö\é≡Æ╟ë┴ü|ò]ë┐ùpé╔î÷èJ // ô╞Ä⌐âtâBâïâ^Ä└æòé╔é╞éαé╚éó Options.d é≡öpÄ~ // tar/tgz Åæî╔é⌐éτé╠Ä⌐î╚ë≡ôÇÅæî╔É╢ɼò√û@é≡ò╧ìXü|û{ôûé╔É╢ɼé¬ë┬ö\é╔ // ZIP32J.DLL é╓é╠:rüEa âIâvâVâçâôé╠É╢ɼò√û@é≡Æ╟ë┴ü^Æ∙É│ // ô«ì∞é╡é╚éóé╠é┼ ZIP32J.DLL é╓é╠ jo/job( t/tt ) é╠âTâ|ü[âgé≡ÆföO // âîâXâ|âôâXâtâ@âCâïé≡É╢ɼé╡é─Ägùpé╖éΘï@ö\é≡Æ╟ë┴ // tar è╓ÿAé╠Ä⌐î╚ë≡ôÇÅæî╔é╠ö╗ÆΦÅêù¥é≡Ä└æò // v1.17:ZIP32J 0.20 é╔æ╬ë₧ü|LMZIP32.DLL é╚é╡é┼êΩùùĵô╛é¬ë┬ö\é╔ // âAü[âJâCâoécékékï¡Éºâèâèü[âXï@ö\ ReleaseArchiverDLL é≡Æ╟ë┴ // é╗éΩé╔ö║é╚éó LoadDll/FreeDll/IsXXXArchive é╠ì\ɼò╧ìX // û╝æOé≡è╘êßé┴é─éóé╜âvâìâpâeâB Output é≡ëⁿû╝ // LMZIP32.DLL é┼ê│Åké┼é½é╚é¡é╚é┴é─éóé╜é╠é≡ÅCÉ│ // PackFilter é╠âVâôâ{âïû╝é≡ò╧ìX // âtâBâïâ^è╓ÿAé╠ÅCÉ│ // Find în function é╠üuô`ô¥ôIé╚âoâOüvé╓é╠æ╬ì⌠ // System/Hidden âfâBâîâNâgâèôαé╠âtâ@âCâïé¬æ╬Å█é╔é╚éτé╚é⌐é┴é╜òsï∩ìçé╠ÅCÉ│ // ì─ïAîƒì⌡Åêù¥é╠ìéæ¼ë╗ü|é╗é╠éP // FindClose ö▓é»ÅCÉ│ // v1.18:Delphi 4 é┼é╠âRâôâpâCâïâGâëü[é╔æ╬Åê // v1.19:ZIPî`Ä«Åæî╔é⌐éτé╠Ä⌐î╚ë≡ôÇÅæî╔ì∞ɼï@ö\é≡Ä└æò // v1.20:Ä⌐î╚ë≡ôÇÅæî╔ì∞ɼâpâXÄwÆΦï@ö\Æ╟ë┴ // C++ Builder 3 é┼é╠âRâôâpâCâïâGâëü[ë±ö≡üiô«ì∞ûóèmöFüj // v1.21:DirectoryExists é╠Ä└æòé≡ò╧ìX ( Delphi 4.X æ╬ë₧ ) // è┐ÄÜâpâXû╝é╓é╠æ╬ë₧é╠ï¡ë╗ // üETCmdOpt.AddPath é╠Ä└æòé≡ò╧ìX // üEGetLastChar é╠Ä└æòé≡ò╧ìX( Delphi 2 æ╬ë₧ ) // v1.22:îoë▀âCâxâôâgâTâ|ü[âgé≡Æ╟ë┴ // ReleaseDLL é¬ô«ì∞é╡é╚é⌐é┴é╜é╠é≡ÅCÉ│ // v1.23:Åæî╔â`âFâbâNüEÅæî╔ìXÉVï@ö\Æ╟ë┴ // Äσùvé╚î÷èJâüâ\âbâhé╠ëⁿû╝üEâpâëâüü[â^Æ╟ë┴ // âüâéâèèJò·Åêù¥é╠ôOÆΩ // v1.24:ZIPî`Ä«é┼âRâ}âôâhâëâCâôé╠âpâXâfâèâ~â^é≡'/'é╔é╡é╜ // UNARJ32J.DLL é¬î⌐é┬é⌐éτé╚éóÄ₧é╠âüâbâZü[âWé≡ÅCÉ│ // v1.25:ZIP32J.DLLé┼é╠û╝æOé╔"["é≡è▄é▐âtâ@âCâïé╓é╠æ╬ë₧ // v1.26:CAB32.DLL v0.81 é╔æ╬ë₧ // v1.27:îoë▀âCâxâôâgé¬òsê└ÆΦé╛é┴é╜é╠é≡ÅCÉ│ // v1.28:âüâéâèôWèJï@ö\é╠âTâ|ü[âgé≡Æ╟ë┴ // û▀éΦÆlé≡â`âFâbâNé╡é─é╡é─ùßèOé≡ö¡É╢é╖éΘ ArchiverCheck è╓Éöé≡Æ╟ë┴ // MakeSFX âüâ\âbâhÆåé╔ OnProgress âCâxâôâgé≡ùLî°é╔é╡é╜ // CheckArchive âüâ\âbâhé╠û▀éΦÆlé╠î^é≡ò╧ìX // C++ Builder 3/5 é╔ÄbÆΦæ╬ë₧ // v1.29:Delphi 2 é┼âRâôâpâCâïâGâëü[é¬ö¡É╢é╖éΘé╠é≡ÅCÉ│ // v1.30:èeâüâ\âbâhé╠ FileList ê°Éöé╠î^é≡ò╧ìX // Delphi 3 é┼âRâôâpâCâïâGâëü[é¬ö¡É╢é╖éΘé╠é≡ÅCÉ│ // v1.31:BGA32.DLLé╔éµéΘGZA/BZAî`Ä«é╓é╠æ╬ë₧é≡èJÄn // ôαòöâtâBâïâ^Ä└ìsÆåé╠ProgressâCâxâôâgö¡É╢ï@ö\é≡Æ╟ë┴ // Ä⌐î╚ë≡ôÇÅæî╔é╠î`Ä«ö╗ÆΦé╠ùDɵÅçÅÿé≡ò╧ìX ( ZIP é╠ùDɵÅçê╩é≡ë║é░é╜ ) // v1.32:YZ1.DLL/YYZ32.DLLé╔éµéΘYZ1î`Ä«Åæî╔é╓é╠æ╬ë₧é≡èJÄn // PackFilter é╠Åëè·Ælé≡ pfComponent é╔ò╧ìX // IsZipArchive/IsBgaArchive é╠Ä└æòé≡ò╧ìX // Åæî╔î`Ä«é¬ô┴ÆΦé┼é½é╚é⌐é┴é╜Ä₧é╔ MakeSfx ôαé┼ Access Violation é¬ // ö¡É╢é╖éΘòsï∩ìçé≡ÅCÉ│ // v1.33:ôαòöâtâBâïâ^Ä└ìsæOé╔ DLL ùLû│é≡â`âFâbâNé╖éΘï@ö\é≡Æ╟ë┴ // v1.34:ôαòöâtâBâïâ^é╔èεÅÇâfâBâîâNâgâèé≡ê╙Ä»é╡é╜Åêù¥é≡Æ╟ë┴ // FindOpen âüâ\âbâhé╔û▀éΦÆlé≡Æ╟ë┴ // TYZ1 é¬É╢ɼé╖éΘâRâ}âôâhâëâCâôé≡ YZ1.DLL 0.20 / YYZ32.DLL 0.80 // ïñÆ╩Ädùlé╔ìçéφé╣é╜ // TYZ1 é¬Ägùpé╖éΘ DLL é╠èOòöâåâjâbâgé⌐éτé╠ò╧ìXé╔æ╬ë₧ // TYZ1 é┼YZ1.DLL ôαé┼é╠ùßèOæ╬ì⌠é≡Æ╟ë┴ // v1.36:TAR32.DLL é╔éµéΘ cpio/rpm/deb/ar î`Ä«âTâ|ü[âgé╠Æ╟ë┴ // UNGCA32.DLL é╔éµéΘ GCA î`Ä«é╠âTâ|ü[âgé≡Æ╟ë┴ // UNBEL32.DLL é╔éµéΘ BEL î`Ä«é╠âTâ|ü[âgé≡Æ╟ë┴ // UNLHA32.DLL é╠ js âIâvâVâçâôé╠âTâ|ü[âgé≡Æ╟ë┴ // v1.37:Delphi 6 é╔æ╬ë₧ // v1.38:ôαòöâtâBâïâ^é╔ï¡ÉºôIé╔æèæ╬âpâXé≡ïLÿ^é│é╣éΘï@ö\é≡Æ╟ë┴ ( jfé╔-2 ) // DLL é⌐éτé╠âGâôâgâèâ|âCâôâgé╠ĵô╛ò√û@é≡ò╧ìX // v1.39:ÉVAPIé╠êΩòö(GetWriteTimeEx/GetCreateTimeEx/GetAccessTimeEx)é╔æ╬ë₧ // YZ1.DLL é╠ âpâXâÅü[âhè╓ÿA API é╓é╠æ╬ë₧é≡Æ╟ë┴ // unit ARCHIVES; interface {$INCLUDE VERSION.INC} uses Messages, Windows, Classes, SysUtils; const // TArchiveFile.FindOpen é╠ dwMode é╔ë║ïLârâbâgâ}âXâNé╠ægé▌ìçéφé╣é≡ÄwÆΦé╖éΘ M_INIT_FILE_USE = $00000001; // âîâWâXâgâèé╠É▌ÆΦé≡Ägùp M_REGARDLESS_INIT_FILE = $00000002; // üV é≡Ägùpé╡é╚éó M_CHECK_ALL_PATH = $00000100; // î╡èié╚âtâ@âCâïû╝âTü[â` M_CHECK_FILENAME_ONLY = $00000200; // üVé≡ìséφé╚éó M_USE_DRIVE_LETTER = $00001000; // âhâëâCâuû╝é⌐éτèiö[ M_NOT_USE_DRIVE_LETTER = $00002000; // üV é≡èiö[é╡é╚éó M_ERROR_MESSAGE_ON = $00400000; // âGâëü[âüâbâZü[âWé≡ò\Ī M_ERROR_MESSAGE_OFF = $00800000; // üVé≡ò\Īé╡é╚éó M_RECOVERY_ON = $08000000; // öjæ╣âwâbâ_é╠ô╟é▌ö≥é╬é╡ EXTRACT_FOUND_FILE = $40000000; // îƒì⌡é│éΩé╜âtâ@âCâïé≡ë≡ôÇ EXTRACT_NAMED_FILE = $80000000; // ÄwÆΦé╡é╜âtâ@âCâïé≡ë≡ôÇ (* Åæî╔â`âFâbâNâéü[âh *) CHECKARCHIVE_RAPID = $0000; // è╚ê╒âéü[âhüB èiö[âtâ@âCâïé╠ CRC â`âFâbâNé═ // ìséφé╕üCâwâbâ_é╠é▌â`âFâbâNé╡é▄é╖üBé▒é╠âéü[ // âhé═éeécécÅπé╠Åæî╔âtâ@âCâïé┼Åêù¥é╔Ä₧è╘é¬è| // é⌐éΘé╠é≡ûhé«é╜é▀ì┼Åëé⌐éτéRé┬û┌é▄é┼é╠âtâ@âC // âïâwâbâ_é╔é┬éóé─é╠é▌â`âFâbâNé≡ìséóé▄é╖üB // é▄é╜üCâwâbâ_é¬î⌐é┬é⌐éτé╚éóÅΩìçé═âtâ@âCâïé╠ // ɵô¬ 128K é▄é┼âwâbâ_é╠îƒì⌡é≡ìséóé▄é╖üB CHECKARCHIVE_BASIC = $0001; // è╚ê╒âéü[âhüB0 é╠ÅΩìçé╞êßé┴é─é▒é┐éτé═æSé─é╠ // âtâ@âCâïâwâbâ_é╔é┬éóé─â`âFâbâNé╡é▄é╖üB CHECKARCHIVE_FULLCRC = $0002; // î╡ûºâéü[âhüB èiö[âtâ@âCâïé╠ CRC éαâ`âFâbâN // é╡é▄é╖üBé╜é╛é╡üCâtâ@âCâïé¬Åæé½ì₧é▄éΩé╚éóé╛ // é»é┼ôWèJÅêù¥é¬ìséφéΩéΘé▒é╞é╔é╚éΘé╠é┼Ä└ìsÄ₧ // è╘é¬Æ╖é¡é╚éΦé▄é╖üB (* Åæî╔â`âFâbâNâIâvâVâçâô *) CHECKARCHIVE_RECOVERY = $0004; // öjæ╣âwâbâ_é≡û│ÄïüBé▒é╠âtâëâOé≡ÄwÆΦé╖éΘé╞üC // öjæ╣âwâbâ_é≡û│Äïé╡é─üCé╗éΩê╚ì~é╠èiö[âtâ@âC // âïé╓é╠âAâNâZâXé¬ë┬ö\é╔é╚éΦé▄é╖üB CHECKARCHIVE_SFX = $0008; // Ä⌐î╚ë≡ôÇÅæî╔é⌐é╟éñé⌐é≡èmöFüBÆ╩Åφé╔é¿éóé─é═ // Åæî╔é╞öFÄ»é│éΩé╜ÅΩìçé╔é═ TRUE é≡ò╘é╡é▄é╖é¬üC // é▒é╠âtâëâOé≡ÄwÆΦé╖éΘé╞üCÄ⌐î╚ë≡ôÇÅæî╔é╞öFÄ» // é│éΩé╜ÅΩìçé╔Ä⌐î╚ë≡ôÇÅæî╔é╠Äφù▐é≡éáéτéφé╖Éö // Ælé≡ò╘é╡é▄é╖üB CHECKARCHIVE_ALL = $0010; // CHECKARCHIVE_RAPID âéü[âhé┼üC âwâbâ_îƒì⌡é≡ // âtâ@âCâïé╠é╖é╫é─é╠ù╠êµé╔é┬éóé─ìséóé╜éóÅΩìç // é╔ÄwÆΦé╡é▄é╖üB (* WARNING *) ERROR_DISK_SPACE = $8005; ERROR_READ_ONLY = $8006; ERROR_USER_SKIP = $8007; ERROR_UNKNOWN_TYPE = $8008; ERROR_METHOD = $8009; ERROR_PASSWORD_FILE = $800A; ERROR_VERSION = $800B; ERROR_FILE_CRC = $800C; ERROR_FILE_OPEN = $800D; ERROR_MORE_FRESH = $800E; ERROR_NOT_EXIST = $800F; ERROR_ALREADY_EXIST = $8010; ERROR_TOO_MANY_FILES = $8011; (* ERROR *) ERROR_MAKEDIRECTORY = $8012; ERROR_CANNOT_WRITE = $8013; ERROR_HUFFMAN_CODE = $8014; ERROR_COMMENT_HEADER = $8015; ERROR_HEADER_CRC = $8016; ERROR_HEADER_BROKEN = $8017; ERROR_ARC_FILE_OPEN = $8018; ERROR_NOT_ARC_FILE = $8019; ERROR_CANNOT_READ = $801A; ERROR_FILE_STYLE = $801B; ERROR_COMMAND_NAME = $801C; ERROR_MORE_HEAP_MEMORY = $801D; ERROR_ENOUGH_MEMORY = $801E; ERROR_ALREADY_RUNNING = $801F; ERROR_USER_CANCEL = $8020; ERROR_HARC_ISNOT_OPENED = $8021; ERROR_NOT_SEARCH_MODE = $8022; ERROR_NOT_SUPPORT = $8023; ERROR_TIME_STAMP = $8024; ERROR_TMP_OPEN = $8025; ERROR_LONG_FILE_NAME = $8026; ERROR_ARC_READ_ONLY = $8027; ERROR_SAME_NAME_FILE = $8028; ERROR_NOT_FIND_ARC_FILE = $8029; ERROR_RESPONSE_READ = $802A; ERROR_NOT_FILENAME = $802B; ERROR_TMP_COPY = $802C; ERROR_EOF = $802D; // âAü[âJâCâoâIâvâVâçâôé╠è∙ÆΦÆlüB // èeüXIntegerâ^âCâvé╞stringâ^âCâvâIâvâVâçâôé╠üuûóÉ▌ÆΦüvÅ≤æ╘é≡ò\éφé╖ aoiUnAssigned = -1; aosUnAssigned = #0; FNAME32_MAX = 512; (* îoë▀Æ╩ÆmâüâbâZü[âWè╓ÿA *) ARCEXTRACT_BEGIN = 0; // èYôûâtâ@âCâïé╠Åêù¥é╠èJÄn ARCEXTRACT_INPROCESS = 1; // èYôûâtâ@âCâïé╠ôWèJÆå ARCEXTRACT_END = 2; // Åêù¥ÅIù╣üAè╓ÿAâüâéâèé≡èJò· ARCEXTRACT_OPEN = 3; // èYôûÅæî╔é╠Åêù¥é╠èJÄn ARCEXTRACT_COPY = 4; // âÅü[âNâtâ@âCâïé╠Åæé½û▀é╡ lpszWMARCEXTRACT = 'wm_arcextract'; var WM_ARCEXTRACT: UINT; type LPVOID = Pointer; LPBYTE =^BYTE; LPWORD =^WORD; time_t = LongInt; ptime_t =^time_t; THARC = HGLOBAL; LPFARPROC =^FARPROC; LPPTR =^Pointer; {$IFNDEF VER90} // not Delphi 2 ? {$IFNDEF VER100} // not Delphi 3 ? {$EXTERNALSYM LPVOID} {$EXTERNALSYM LPBYTE} {$EXTERNALSYM LPWORD} {$ENDIF} {$ENDIF} // âAü[âJâCâoé╠ FindFirst/FindNext âtâ@âôâNâVâçâôé┼Ägùpé│éΩéΘì\æóæ╠ TIndivisualInfo = packed record dwOriginalSize: DWORD; dwCompressedSize: DWORD; dwCRC: DWORD; uFlag: UINT; uOSType: UINT; wRatio: WORD; wDate: WORD; wTime: WORD; szFileName: array[0..FNAME32_MAX] of char; dummy1: array[0..2] of char; szAttribute: array[0..7] of char; szMode: array[0..7] of char; //ê╚ë║é═ô╞Ä⌐ègÆúò¬é╔é┬é½ì\æóæ╠Æåé╠ê╩Æué═ìíîπò█Å╪é│éΩé╚éó WriteTime: TFileTime; AccessTime: TFileTime; CreateTime: TFileTime; end; PIndivisualInfo = ^TIndivisualInfo; // ArchiverProc é╔ôné│éΩéΘì\æóæ╠ TExtractingInfo = packed record dwFileSize: DWORD; dwWriteSize: DWORD; szSourceFileName: array[0..FNAME32_MAX] of char; dummy1: array[0..2] of char; szDestFileName: array[0..FNAME32_MAX] of char; dummy: array[0..2] of char; end; TExtractingInfoEx = packed record exinfo: TExtractingInfo; dwCompressedSize: DWORD; dwCRC: DWORD; uOSType: UINT; wRatio: WORD; wDate: WORD; wTime: WORD; szAttribute: array[0..7] of char; szMode: array[0..7] of char; end; LPEXTRACTINGINFOEX = ^TExtractingInfoEx; TArchiverProc = function( Handle:HWND;uMsg:UINT;nState:UINT;lpEis:LPEXTRACTINGINFOEX ):BOOL; stdcall; LPArchiverProc = ^TArchiverProc; // ôαòöé┼ö¡É╢é│é╣éΘùßèO EArchiver = class( Exception ) public ErrorCode: integer; end; ENoArchiverDLL = class( EArchiver ) end; EEntryNotFound = class( EArchiver ) end; // âAü[âJâCâuî`Ä«Äφò╩ TArchiverType = ( atLha,atZip,atCab,atArj,atTar,atTgz,atBZ2,atRar,atBga,atYz1,atGCA,atBel,atNone,atAutoDetect ); // ê│ÅkÄ₧é╠âtâBâïâ^ TPackFilter = ( pfArchiver,pfComponent ); // âîâXâ|âôâXâtâ@âCâïé╠ÄgùpÅ≡îÅ TResFileUse = ( ruOnPack,ruOnUnpack,ruOnRemoveItem,ruOnUpdate ); TResFileUsage = set of TResFileUse; // âRâ}âôâhâëâCâôé╠î`Ä« TCmdOptFormat = ( cfInner,cfOuter ); TArchiverOptions = class; TArchiver = class; TCmdOpt = class; TArchiverProgressEvent = procedure( Sender:TObject;State:Integer;lpEis:LPExtractingInfoEx;var Abort:boolean ) of object; // State é≡ UINT é╔é╖éΘé╞ Delphi é╠âoü[âWâçâôé╔éµé┴é─â\ü[âXé╠î▌è╖ɽé╔ûΓæΦé¬É╢é╢éΘ TFilterProc = function( FileName:string ):string; TArchiveFile = class( TComponent ) private FArchiverType: TArchiverType; FArchiver: TArchiver; FOptions: TArchiverOptions; FFileName: TFileName; // Archive FileName FCmdLine: string; // É╢ɼé╡é╜âRâ}âôâhâëâCâô ( âfâoâbâOùp ) FOutputBuff: string; // Åoù═âüâbâZü[âWé≡èiö[é╖éΘâoâbâtâ@ FOwnerWindow: HWND; FOnProgress: TArchiverProgressEvent; protected FhArc: THARC; private procedure ArchiverWndProc( var Message:TMessage ); procedure DisableEvents; procedure EnableEvents; procedure DoProgress( State:UINT;lpEis:LPExtractingInfoEx;var Abort:boolean ); protected procedure DetectArchiverType; procedure SetFileName( ArchiveFileName:TFileName ); procedure CheckArchiverType; procedure SetArchiverType( ArchiverType:TArchiverType ); procedure SetOutputSize( OutputSize:integer ); function GetOutputSize:integer; function GetOutput:string; public constructor Create( AOwner:TComponent ); override; destructor Destroy; override; // î÷èJâüâ\âbâh ü| Åæî╔ôWèJü^Åæî╔ì∞ɼü^Åæî╔ôαâtâ@âCâïìφÅ£ü^Ä⌐î╚ë≡ôÇÅæî╔ì∞ɼ function UnpackFiles ( Handle:HWND;Options:TArchiverOptions;DstPath:String;FileList:array of const ):Integer; function PackFiles ( Handle:HWND;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer; function RemoveItems ( Handle:HWND;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer; function UpdateArchive( Handle:HWND;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer; function MakeSfx ( Handle:HWND;Options:TArchiverOptions;DstPath:String ):Integer; function UnpackToMem ( Handle:HWND;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD ):Integer; function CheckArchive ( CheckMode:integer;CheckOptions:integer ):DWORD; // FindFirst / FindNext înâtâ@âôâNâVâçâô function FindOpen( Handle:HWND;dwMode:DWORD ):integer; function FindFirst( FileMask:string;var IndivisualInfo:TIndivisualInfo ):integer; function FindNext ( var IndivisualInfo:TIndivisualInfo ):integer; function FindClose:integer; // î├éóî`Ä«é╠âüâ\âbâh // function UnpackTo ( Handle:HWND;DstPath:String;FileList:TStrings ):Integer; // function PackTo ( Handle:HWND;BaseDir:String;FileList:TStrings ):Integer; // function RemoveItem ( Handle:HWND;BaseDir:String;FileList:TStrings ):Integer; // function MakeSfxFile( Handle:HWND;DstPath:String ):Integer; public // Ä└ìsÄ₧âvâìâpâeâB property CmdLine: string read FCmdLine; // É╢ɼé╡é╜âRâ}âôâhâëâCâôé≡èmöFé╖éΘé╜é▀é╠âvâìâpâeâBü|âfâoâbâOùp property Output: string read GetOutput; // Åêù¥âìâOĵô╛ùpâvâìâpâeâB // property OutputBuff: string read GetOutput; // è╘êßé┴é─éóé╜î├éóû╝æO published // É▌îvÄ₧âvâìâpâeâB property FileName: TFileName read FFileName write SetFileName; property OutputSize: integer read GetOutputSize write SetOutputSize; property Options: TArchiverOptions read FOptions write FOptions; property ArchiverType: TArchiverType read FArchiverType write SetArchiverType; // âCâxâôâg property OnProgress: TArchiverProgressEvent read FOnProgress write FOnProgress; end; // âAü[âJâCâo é╠ ô«ì∞É▌ÆΦâIâvâVâçâô TArchiverOptions = class( TPersistent ) protected procedure AssignTo( Dest:TPersistent ); override; protected Fa: ShortInt; // a[0|1|2] æ«É½é╠ì─î╗üB Fc: ShortInt; // c[0|1] â^âCâÇâXâ^âôâvîƒì╕é≡Å╚ù¬ // Fd: ShortInt; // d[0|1] âfâBâîâNâgâèû╝é╠èiö[ü|öpÄ~ Fe: ShortInt; // e[0|1] ĽÅæâTâCâYé≡ö╝ò¬é╔é╡é─ê│Åk Ff: ShortInt; // f[0|1] âfâBâXâNÄcù╩â`âFâbâNé╠ÆåÄ~ Fh: ShortInt; // h[0|1|2|3] âwâbâ_é╠î`Ä«é≡ÄwÆΦ Fi: ShortInt; // i[0|1|2] âtâ@âCâïæIæ≡é┼æσò╢ÄÜé╞żò╢ÄÜé≡ïµò╩ Fl: ShortInt; // l[0|1|2] ôWèJâìâOé╠âtâ@âCâïû╝é╠ò\Īû@é╠ò╧ìX Fm: ShortInt; // m[0|1|2] Ä┐ûΓé╔ yes é╞ë╝ÆΦ Fn: ShortInt; // n[0|1] ôWèJÅ≤ï╡â_âCâAâìâOò\Īé╠ù}Ä~ Fo: ShortInt; // o[0|1|2] ïîî`Ä«é┼Åæî╔é≡ì∞ɼ Fp: ShortInt; // p[0|1|2] æSâpâXû╝é┼ìçÆv Fr: ShortInt; // r[0|1|2] ì─ïAôIîƒì⌡ Fs: ShortInt; // s[0|1] âXâLâbâvò\Īé╠ù}ɺ Ft: ShortInt; // t[0|1] Åæî╔é╠ìXÉVô·Ä₧é╠ÄwÆΦ Fu: ShortInt; // u[0|1] âtâ@âCâïé╠ìXÉVüiÉVé╡éóéαé╠üj Fw: string; // w[0|1|<Dirû╝>] ì∞ï╞ùpâfâBâîâNâgâèé╠ÄwÆΦ Fx: ShortInt; // x[0|1] âfâBâîâNâgâèû╝é≡ùLî°é╔é╖éΘ Fy: ShortInt; // y[0|1] æSé─é╠Ä┐ûΓé╔ yes é╞ë╝ÆΦ Fz: ShortInt; // z[0|1|2|<ègÆúÄq>] ûóê│Åkâtâ@âCâïé╠ÄwÆΦ ###ègÆúÄqé═âTâ|ü[âgé╡é╚éó### Fjc: ShortInt; // jc[0|1] öjæ╣âwâbâ_é≡û│Äï Fjd: ShortInt; // jd[<âTâCâY>] âfâBâXâNé╠ï≤é½ùeù╩é≡èmöF Fje: ShortInt; // je[<âTâCâY>] Huffman âoâbâtâ@é╠æσé½é│é≡ÄwÆΦ Fjf: ShortInt; // jf[0|1] âïü[âgïLìåé╠ìφÅ£ Fjh: ShortInt; // jh[0|1] WindowsNT/95 ÉΩùpé╠â}ü[âNé≡Åæî╔é╔òtë┴ Fji: ShortInt; // ji[0|1] ÆZéóâtâ@âCâïû╝é┼èiö[ Fjm: ShortInt; // jm[0|1|2|3|4] ê│Åkâîâxâïé≡ÄwÆΦ Fjn: ShortInt; // jn[0|1] ÉVïKâtâ@âCâïé╠é▌ Fjo: string; // jo[<Ä₧ìÅÄwÆΦ>] YYMMDDHHMMSS é╠ô·òtê╚ì~ Fjob: string; // job[<Ä₧ìÅÄwÆΦ>] YYMMDDHHMMSS é╠ô·òtê╚æO Fjp: ShortInt; // jp[0|1] ÉiÆ╗âoü[é≡âvâìâOâîâXüEâoü[é┼ò\Ī Fjr: ShortInt; // jr[0|1] âtâ@âCâïé╠Æué½è╖éª Fjsb: ShortInt; // jsb[0|1] âüâbâZü[âWâïü[âvé≡ë±é│é╚éó Fjsc: ShortInt; // jsc[0|1] ôWèJé┼é½é╚é⌐é┴é╜âtâ@âCâïÉöé≡ò╘é╖ Fjsd: ShortInt; // jsd[0|1] ï≤é½ùeù╩ĵô╛é╔Ä╕ösé╡é╜ÅΩìçé╠Åêù¥é≡ÄwÆΦ Fjse: ShortInt; // jse[0|1] ôWèJÄ₧é╠ÅπÅæé½âIü[âvâôôÖé≡âGâëü[é╞é╖éΘ Fjsf: ShortInt; // jsf[0|1] â^âCâÇâXâ^âôâvé╠òΓÉ│é≡ìséφé╚éó Fjsl: ShortInt; // jsl[0|1] ê│ÅküEèiö[âtâ@âCâïé╠Ådòíâ`âFâbâNé≡ìséφé╚éó Fjso: ShortInt; // jso[0|1] SH_DENYNO é┼é╠âIü[âvâôé≡ìséφé╚éó Fjss: ShortInt; // jss[0|1] ïñùLâGâëü[é╠ÅΩìçé╔Åêù¥é≡æ▒ìs Fjst: ShortInt; // jst[0|1] FILETIME ì\æóæ╠âwâbâ_é╠èiö[é≡Å╚ù¬ Fjsv: ShortInt; // jsv[0|1] Åæî╔æÇì∞îπé╔Åæî╔é≡â`âFâbâN Fjsz: ShortInt; // jsz[0|1] żò╢ÄÜé╠ègÆúÄqé≡òtë┴ Fjw: ShortInt; // jw[0|1|2|3|4] WinSFX/WinSFXM é≡ì∞ɼ Fjx: TStringList;// jx[<âtâ@âCâïû╝>] Å£èOé╖éΘâtâ@âCâïû╝ Fjyc: ShortInt; // jyc[0|1] âfâBâîâNâgâèì∞ɼé╠èmöFé≡Å╚ù¬ Fjyd: ShortInt; // jyd[0|1] âtâ@âCâïìφÅ£é╠èmöFé≡Å╚ù¬ Fjyk: ShortInt; // jyk[0|1] Ägùpé┼é½éΘâfâBâXâNùeù╩é╠èmöFé╠Å╚ù¬ Fjyn: ShortInt; // jyn[0|1] ÉVâtâ@âCâïû╝é╠ùvïüé╠Å╚ù¬ Fjyo: ShortInt; // jyo[0|1] è∙æ╢âtâ@âCâïé╓é╠ÅπÅæé½èmöFé╠Å╚ù¬ Fjz: string; // jz[<âtâ@âCâïû╝>] âtâ@âCâïÆìÄ▀é╠âtâ@âCâïé≡ïƒïï Fga: ShortInt; // ga[0|1] Åæé½ì₧é▌òsë┬æ«É½é≡û│Äï Fgd: ShortInt; // gd[0|1] ù]ò¬é╚âfü[â^é╠ìφÅ£ Fge: ShortInt; // ge[0|1] ì┼Åëé╠ègÆúÄqé≡öFÄ» Fgf: ShortInt; // gf[0|1|2] é╖é┼é╔éáéΘâtâ@âCâïé╠ìXÉV Fgj: ShortInt; // gj[0|1] x û╜ù▀é≡ e û╜ù▀é╞ô»ùlé╞î⌐é╚é╖ Fgm: ShortInt; // gm[0|1] âGâëü[âüâbâZü[âWò\Īé╠ù}Ä~ Fgn: ShortInt; // gn[0|1|2] ôWèJâtâ@âCâïé╠ìçîvâTâCâYé≡ 100% é╞é╡é╜ÉiÆ╗âOâëâté╠ò\Ī Fgo: ShortInt; // go[0|1] â_âCâAâìâOé╠âIü[âiü[âEâBâôâhâEé╠ÄwÆΦ Fgp: ShortInt; // gp[0|1] âEâBâôâhâEé≡ Disable é╔é╡é╚éó Fgr: string; // gr[<âtâ@âCâïû╝>] ò╧ìXâtâ@âCâïû╝é≡ïƒïï Fgs: ShortInt; // gs[<âTâCâY>] âwâbâ_îƒì⌡âTâCâYé╠ÄwÆΦ Fgu: ShortInt; // gu[0|1] WinSFXüCDosSFX é╔æSé─é╠âtâ@âCâïé≡èiö[ Fgw: ShortInt; // gw[0|1|2|3|4] WinSFX32/WinSFX32M é≡ì∞ɼ FUserOptions: string; // Æ╝É┌ÄwÆΦé╠âIâvâVâçâô FUserFileList: string; // Æ╝É┌ÄwÆΦé╠âtâ@âCâïâèâXâg FPackFilter: TPackFilter; // Åæî╔É╢ɼÄ₧ÄgùpâtâBâïâ^é╠ÄwÆΦ FResFileName: TFileName; // âîâXâ|âôâXâtâ@âCâïû╝é╠ÄwÆΦ FResFileUsage: TResFileUsage; // âîâXâ|âôâXâtâ@âCâïÄgùpÅ≡îÅé╠ÄwÆΦ public constructor Create; destructor Destroy; override; procedure init; published property a: ShortInt read Fa write Fa default aoiUnassigned; // a[0|1|2] æ«É½é╠ì─î╗üB property c: ShortInt read Fc write Fc default aoiUnassigned; // c[0|1] â^âCâÇâXâ^âôâvîƒì╕é≡Å╚ù¬ // property d: ShortInt read Fd write Fd default aoiUnassigned; // d[0|1] âfâBâîâNâgâèû╝é╠èiö[ property e: ShortInt read Fe write Fe default aoiUnassigned; // e[0|1] ĽÅæâTâCâYé≡ö╝ò¬é╔é╡é─ê│Åk property f: ShortInt read Ff write Ff default aoiUnassigned; // f[0|1] âfâBâXâNÄcù╩â`âFâbâNé╠ÆåÄ~ property h: ShortInt read Fh write Fh default aoiUnassigned; // h[0|1|2|3] âwâbâ_é╠î`Ä«é≡ÄwÆΦ property i: ShortInt read Fi write Fi default aoiUnassigned; // i[0|1|2] âtâ@âCâïæIæ≡é┼æσò╢ÄÜé╞żò╢ÄÜé≡ïµò╩ property l: ShortInt read Fl write Fl default aoiUnassigned; // l[0|1|2] ôWèJâìâOé╠âtâ@âCâïû╝é╠ò\Īû@é╠ò╧ìX property m: ShortInt read Fm write Fm default aoiUnassigned; // m[0|1|2] Ä┐ûΓé╔ yes é╞ë╝ÆΦ property n: ShortInt read Fn write Fn default aoiUnassigned; // n[0|1] ôWèJÅ≤ï╡â_âCâAâìâOò\Īé╠ù}Ä~ property o: ShortInt read Fo write Fo default aoiUnassigned; // o[0|1|2] ïîî`Ä«é┼Åæî╔é≡ì∞ɼ property p: ShortInt read Fp write Fp default aoiUnassigned; // p[0|1|2] æSâpâXû╝é┼ìçÆv property r: ShortInt read Fr write Fr default aoiUnassigned; // r[0|1|2] ì─ïAôIîƒì⌡ property s: ShortInt read Fs write Fs default aoiUnassigned; // s[0|1] âXâLâbâvò\Īé╠ù}ɺ property t: ShortInt read Ft write Ft default aoiUnassigned; // t[0|1] Åæî╔é╠ìXÉVô·Ä₧é╠ÄwÆΦ property u: ShortInt read Fu write Fu default aoiUnassigned; // u[0|1] âtâ@âCâïé╠ìXÉVüiÉVé╡éóéαé╠üj property w: string read Fw write Fw nodefault; // w[0|1|<Dirû╝>] ì∞ï╞ùpâfâBâîâNâgâèé╠ÄwÆΦ property x: ShortInt read Fx write Fx default aoiUnassigned; // x[0|1] âfâBâîâNâgâèû╝é≡ùLî°é╔é╖éΘ property y: ShortInt read Fy write Fy default aoiUnassigned; // y[0|1] æSé─é╠Ä┐ûΓé╔ yes é╞ë╝ÆΦ property z: ShortInt read Fz write Fz default aoiUnassigned; // z[0|1|2|<ègÆúÄq>] ûóê│Åkâtâ@âCâïé╠ÄwÆΦ ###ègÆúÄqé═âTâ|ü[âgé╡é╚éó### property jc: ShortInt read Fjc write Fjc default aoiUnassigned; // jc[0|1] öjæ╣âwâbâ_é≡û│Äï property jd: ShortInt read Fjd write Fjd default aoiUnassigned; // jd[<âTâCâY>] âfâBâXâNé╠ï≤é½ùeù╩é≡èmöF property je: ShortInt read Fje write Fje default aoiUnassigned; // je[<âTâCâY>] Huffman âoâbâtâ@é╠æσé½é│é≡ÄwÆΦ property jf: ShortInt read Fjf write Fjf default aoiUnassigned; // jf[0|1] âïü[âgïLìåé╠ìφÅ£ property jh: ShortInt read Fjh write Fjh default aoiUnassigned; // jh[0|1] WindowsNT/95 ÉΩùpé╠â}ü[âNé≡Åæî╔é╔òtë┴ property ji: ShortInt read Fji write Fji default aoiUnassigned; // ji[0|1] ÆZéóâtâ@âCâïû╝é┼èiö[ property jm: ShortInt read Fjm write Fjm default aoiUnassigned; // jm[0|1|2|3|4] ê│Åkî`Ä«é≡ÄwÆΦ property jn: ShortInt read Fjn write Fjn default aoiUnassigned; // jn[0|1] ÉVïKâtâ@âCâïé╠é▌ property jo: string read Fjo write Fjo nodefault; // jo[<Ä₧ìÅÄwÆΦ>] YYMMDDHHMMSS é╠ô·òtê╚ì~ property job: string read Fjob write Fjob nodefault; // job[<Ä₧ìÅÄwÆΦ>] YYMMDDHHMMSS é╠ô·òtê╚æO property jp: ShortInt read Fjp write Fjp default aoiUnassigned; // jp[0|1] ÉiÆ╗âoü[é≡âvâìâOâîâXüEâoü[é┼ò\Ī property jr: ShortInt read Fjr write Fjr default aoiUnassigned; // jr[0|1] âtâ@âCâïé╠Æué½è╖éª property jsb: ShortInt read Fjsb write Fjsb default aoiUnassigned; // jsb[0|1] âüâbâZü[âWâïü[âvé≡ë±é│é╚éó property jsc: ShortInt read Fjsc write Fjsc default aoiUnassigned; // jsc[0|1] ôWèJé┼é½é╚é⌐é┴é╜âtâ@âCâïÉöé≡ò╘é╖ property jsd: ShortInt read Fjsd write Fjsd default aoiUnassigned; // jsd[0|1] ï≤é½ùeù╩ĵô╛é╔Ä╕ösé╡é╜ÅΩìçé╠Åêù¥é≡ÄwÆΦ property jse: ShortInt read Fjse write Fjse default aoiUnassigned; // jse[0|1] ôWèJÄ₧é╠ÅπÅæé½âIü[âvâôôÖé≡âGâëü[é╞é╖éΘ property jsf: ShortInt read Fjsf write Fjsf default aoiUnassigned; // jsf[0|1] â^âCâÇâXâ^âôâvé╠òΓÉ│é≡ìséφé╚éó property jsl: ShortInt read Fjsl write Fjsl default aoiUnassigned; // jsl[0|1] ê│ÅküEèiö[âtâ@âCâïé╠Ådòíâ`âFâbâNé≡ìséφé╚éó property jso: ShortInt read Fjso write Fjso default aoiUnassigned; // jso[0|1] SH_DENYNO é┼é╠âIü[âvâôé≡ìséφé╚éó property jss: ShortInt read Fjss write Fjss default aoiUnassigned; // jss[0|1] ïñùLâGâëü[é╠ÅΩìçé╔Åêù¥é≡æ▒ìs property jst: ShortInt read Fjst write Fjst default aoiUnassigned; // jst[0|1] FILETIME ì\æóæ╠âwâbâ_é╠èiö[é≡Å╚ù¬ property jsv: ShortInt read Fjsv write Fjsv default aoiUnassigned; // jsv[0|1] Åæî╔æÇì∞îπé╔Åæî╔é≡â`âFâbâN property jsz: ShortInt read Fjsz write Fjsz default aoiUnassigned; // jsz[0|1] żò╢ÄÜé╠ègÆúÄqé≡òtë┴ property jw: ShortInt read Fjw write Fjw default aoiUnassigned; // jw[0|1|2|3|4] WinSFX/WinSFXM é≡ì∞ɼ property jx: TStringList read Fjx write Fjx nodefault; // jx[<âtâ@âCâïû╝>] Å£èOé╖éΘâtâ@âCâïû╝ property jyc: ShortInt read Fjyc write Fjyc nodefault; // jyc[0|1] âfâBâîâNâgâèì∞ɼé╠èmöFé≡Å╚ù¬ property jyd: ShortInt read Fjyd write Fjyd default aoiUnassigned; // jyd[0|1] âtâ@âCâïìφÅ£é╠èmöFé≡Å╚ù¬ property jyk: ShortInt read Fjyk write Fjyk default aoiUnassigned; // jyk[0|1] Ägùpé┼é½éΘâfâBâXâNùeù╩é╠èmöFé╠Å╚ù¬ property jyn: ShortInt read Fjyn write Fjyn default aoiUnassigned; // jyn[0|1] ÉVâtâ@âCâïû╝é╠ùvïüé╠Å╚ù¬ property jyo: ShortInt read Fjyo write Fjyo default aoiUnassigned; // jyo[0|1] è∙æ╢âtâ@âCâïé╓é╠ÅπÅæé½èmöFé╠Å╚ù¬ property jz: string read Fjz write Fjz nodefault; // jz[<âtâ@âCâïû╝>] âtâ@âCâïÆìÄ▀é╠âtâ@âCâïé≡ïƒïï property ga: ShortInt read Fga write Fga default aoiUnassigned; // ga[0|1] Åæé½ì₧é▌òsë┬æ«É½é≡û│Äï property gd: ShortInt read Fgd write Fgd default aoiUnassigned; // gd[0|1] ù]ò¬é╚âfü[â^é╠ìφÅ£ property ge: ShortInt read Fge write Fge default aoiUnassigned; // ge[0|1] ì┼Åëé╠ègÆúÄqé≡öFÄ» property gf: ShortInt read Fgf write Fgf default aoiUnassigned; // gf[0|1|2] é╖é┼é╔éáéΘâtâ@âCâïé╠ìXÉV property gj: ShortInt read Fgj write Fgj default aoiUnassigned; // gj[0|1] x û╜ù▀é≡ e û╜ù▀é╞ô»ùlé╞î⌐é╚é╖ property gm: ShortInt read Fgm write Fgm default aoiUnassigned; // gm[0|1] âGâëü[âüâbâZü[âWò\Īé╠ù}Ä~ 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é╠ò\Ī property go: ShortInt read Fgo write Fgo default aoiUnassigned; // go[0|1] â_âCâAâìâOé╠âIü[âiü[âEâBâôâhâEé╠ÄwÆΦ property gp: ShortInt read Fgp write Fgp default aoiUnassigned; // gp[0|1] âEâBâôâhâEé≡ Disable é╔é╡é╚éó property gr: string read Fgr write Fgr nodefault; // gr[<âtâ@âCâïû╝>] ò╧ìXâtâ@âCâïû╝é≡ïƒïï property gs: ShortInt read Fgs write Fgs default aoiUnassigned; // gs[<âTâCâY>] âwâbâ_îƒì⌡âTâCâYé╠ÄwÆΦ property gu: ShortInt read Fgu write Fgu default aoiUnassigned; // gu[0|1] WinSFXüCDosSFX é╔æSé─é╠âtâ@âCâïé≡èiö[ property gw: ShortInt read Fgw write Fgw default aoiUnassigned; // gw[0|1|2|3|4] WinSFX32/WinSFX32M é≡ì∞ɼ property UserOptions: string read FUserOptions write FUserOptions; // Æ╝É┌ÄwÆΦé╠âIâvâVâçâô property UserFileList: string read FUserFileList write FUserFileList; // Æ╝É┌ÄwÆΦé╠âtâ@âCâïâèâXâg property PackFilter: TPackFilter read FPackFilter write FPackFilter default pfComponent; // Åæî╔É╢ɼÄ₧ÄgùpâtâBâïâ^é╠ÄwÆΦ property ResFileName: TFileName read FResFileName write FResFileName; // âîâXâ|âôâXâtâ@âCâïû╝é╠ÄwÆΦ property ResFileUsage: TResFileUsage read FResFileUsage write FResFileUsage; // âîâXâ|âôâXâtâ@âCâïÄgùpÅ≡îÅé╠ÄwÆΦ end; // üuâAü[âJâCâoüvâxü[âXâNâëâXü|èeâAü[âJâCâoé═é▒é╠âNâëâXé⌐éτöhÉ╢é╡é─Ä└æòé╖éΘ TArchiver = class private FOwnerWindow: HWND; protected FCmdLine: string; // É╢ɼé╡é╜âRâ}âôâhâëâCâô ( âfâoâbâOùp ) protected class procedure LoadDll; virtual; class procedure FreeDll; virtual; function FindOpen ( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ):THARC; virtual; function FindFirst( hArc:THArc;var IndivisualInfo:TIndivisualInfo;FileMask:string ):integer; virtual; function FindNext ( hArc:THArc;var IndivisualInfo:TIndivisualInfo ):integer; virtual; function FindClose( hArc:THArc ):integer; virtual; // ôαòöé┼Ägùpé╖éΘâüâ\âbâhü|É▌ÆΦé╡é╜âtâ@âCâïé≡âRâ}âôâhâëâCâôé╔ôWèJé╖éΘ procedure AddFileSpec1( CmdLine:TCmdOpt;ArchiveFileName:string;path:string ); function AddFileSpec2( CmdLine:TCmdOpt;Options:TArchiverOptions;FileList:array of const;UseResFile:boolean ):integer; public constructor Create; destructor Destroy; override; // î÷èJâüâ\âbâhü|ôWèJü^ì∞ɼü^Ä⌐î╚ë≡ôÇÅæî╔ì∞ɼ ï@ö\ function UnpackFiles ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;DstPath:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; virtual; abstract; function PackFiles ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; virtual; function RemoveItems ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; virtual; function UpdateArchive( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; virtual; function MakeSfx ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;DstPath:String ;var Output:string ):Integer; virtual; function UnpackToMem ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD ):Integer; virtual; function CheckArchive ( ArchiveFileName:string;CheckMode:integer;CheckOptions:integer ):DWORD; virtual; // âRü[âïâoâbâNÉ▌ÆΦü^ë≡Å£ function SetOwnerWindowEx ( Handle:HWND;lpArcProc:LPARCHIVERPROC ):boolean; virtual; function KillOwnerWindowEx( Handle:HWND ):boolean; virtual; function CallBackEnabled: boolean; {$IFNDEF VER93} // not C++Builder 1 ? class procedure ReleaseDLL; {$ENDIF} procedure BeforePack; virtual; // É╢ɼé╡é╜âRâ}âôâhâëâCâôé≡ĵô╛é╖éΘé╜é▀é╠âvâìâpâeâB property CmdLine: string Read FCmdLine; end; // âRâ}âôâhâëâCâôÉ╢ɼé╠é╜é▀é╠âÅü[âLâôâOâNâëâX TCmdOpt = class private FFormat: TCmdOptFormat; FFilterProc: TFilterProc; FCmdLine: string; public constructor Create; procedure Add( optstr:string ); procedure AddBolOpt( optstr:string;value:boolean ); procedure AddIntOpt( optstr:string;value:integer ); procedure AddIntDef( optstr:string;value:integer;defaultopt:integer ); procedure AddStrOpt( optstr:string;value:string ); procedure AddFName1( optstr,filespec:string ); // âtâBâïâ^é╚é╡âoü[âWâçâô procedure AddPath1 ( optstr,pathspec:string ); // âtâBâïâ^é╚é╡âoü[âWâçâôé╠é▌ procedure AddFName2( optstr,filespec:string ); // âtâBâïâ^éáéΦâoü[âWâçâô function AddFList2( optstr:string;FileList:array of const ):integer; // âtâBâïâ^éáéΦâoü[âWâçâôé╠é▌ function MakeResFile( FileList:array of const;ResFileName:string ):integer; function Filtered( S:string ):string; property Filter: TFilterProc read FFilterProc write FFilterProc; property Format: TCmdOptFormat read FFormat write FFormat; property Str: String read FCmdLine; end; TArcDLLArchiverProc = function( Handle:HWND;lpszCmdLine:PAnsiChar;lpszOutput:PAnsiChar;dwSize:integer ):integer; stdcall; TArcDLLFindOpen = function( Handle:HWND;ArchiveFileName:PAnsiChar;dwMode:DWORD ):THARC; stdcall; TArcDLLFindFirst = function( hArc:THArc;FileMask:PAnsiChar;IndivisualInfo:PIndivisualInfo ):integer; stdcall; TArcDLLFindNext = function( hArc:THArc;IndivisualInfo:PIndivisualInfo ):integer; stdcall; TArcDLLFindClose = function( hArc:THArc ):integer; stdcall; TArcDLLCheckArchive = function( lpszFileName:PAnsiChar;iMode:integer ):DWORD; stdcall; TArcDLLSetOwnerWindowEx = function( Handle:HWND;lpArcProc:LPARCHIVERPROC ):BOOL; stdcall; TArcDLLKillOwnerWindowEx = function( Handle:HWND ):BOOL; stdcall; TArcDLLExtractMem = function( Handle:HWND;lpszCmdLine:PAnsiChar;lpvBuffer:LPBYTE;dwSize:DWORD;lpTime:ptime_t;lpwAttr:LPWORD;lpdwWriteSize:LPDWORD ):integer; stdcall; TArcDLLGetFileTimeEx = function( hArc:THArc;var lpFileTime:TFileTime ):BOOL; stdcall; TTarDLLGetArchiveType = function( lpszFileName:PAnsiChar ):integer; stdcall; // èe Archiver DLL é╠âGâôâgâèâ|âCâôâgé≡ò█Ä¥é╖éΘé╜é▀é╠âNâëâX TCustomArchiverDll = class protected FArchiverProc: FARPROC; FOpenArchive: FARPROC; FCloseArchive: FARPROC; FFindFirst: FARPROC; FFindNext: FARPROC; FExtractMem: FARPROC; FCheckArchive: FARPROC; FSetOwnerWindowEx: FARPROC; FKillOwnerWindowEx: FARPROC; FGetWriteTimeEx: FARPROC; FGetCreateTimeEx: FARPROC; FGetAccessTimeEx: FARPROC; FGetArchiveType: FARPROC; // TAR32.DLL é╠é▌ public constructor Create; destructor Destroy; override; procedure LoadDll; virtual; abstract; procedure FreeDll; virtual; function ArchiverProc( _hwnd:HWND;_lpszCmdLine:PAnsiChar;_lpszOutput:PAnsiChar;_dwSize:DWORD ):integer; virtual; function CheckArchive( lpszFileName:PAnsiChar;iMode:integer ):DWORD; virtual; function CloseArchive( hArc:THARC ):integer; virtual; function ExtractMem( Handle:HWND;lpszCmdLine:PAnsiChar;lpvBuffer:LPBYTE;dwSize:DWORD;lpTime:ptime_t;lpwAttr:LPWORD;lpdwWriteSize:LPDWORD ): integer; virtual; function FindFirst( hArc:THArc;FileMask:string;IndivisualInfo:PIndivisualInfo ):integer; virtual; function FindNext( hArc:THArc;IndivisualInfo:PIndivisualInfo ):integer; virtual; function KillOwnerWindowEx( Handle:HWND ):BOOL; virtual; function OpenArchive( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ): THARC; virtual; function SetOwnerWindowEx( Handle:HWND;lpArcProc:LPARCHIVERPROC ):BOOL; virtual; function GetWriteTimeEx ( hArc:THArc;var lpLastWriteTime:TFileTime ):BOOL; virtual; function GetCreateTimeEx( hArc:THArc;var lpCreateTime :TFileTime ):BOOL; virtual; function GetAccessTimeEx( hArc:THArc;var lpAccessTime :TFileTime ):BOOL; virtual; function GetArchiveType( lpszFileName:PAnsiChar ):integer; virtual; private procedure GetAddtitionalInfo( hArc:THArc;IndivisualInfo:PIndivisualInfo ); end; TArchiverDll = class( TCustomArchiverDll ) protected FhDLL: THandle; FArchiveName: string; FDllName: string; FEntryPrefix: string; public constructor Create( ArchiveName,DllName,EntryPrefix:string ); destructor Destroy; override; procedure LoadDll; override; procedure FreeDll; override; function ArchiverProc( _hwnd:HWND;_lpszCmdLine:PAnsiChar;_lpszOutput:PAnsiChar;_dwSize:DWORD ):integer; override; function CheckArchive( lpszFileName:PAnsiChar;iMode:integer ):DWORD; override; function CloseArchive( hArc:THARC ):integer; override; function ExtractMem( Handle:HWND;lpszCmdLine:PAnsiChar;lpvBuffer:LPBYTE;dwSize:DWORD;lpTime:ptime_t;lpwAttr:LPWORD;lpdwWriteSize:LPDWORD ): integer; override; function FindFirst( hArc:THArc;FileMask:string;IndivisualInfo:PIndivisualInfo ):integer; override; function FindNext( hArc:THArc;IndivisualInfo:PIndivisualInfo ):integer; override; function KillOwnerWindowEx( Handle:HWND ):BOOL; override; function OpenArchive( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ): THARC; override; function SetOwnerWindowEx( Handle:HWND;lpArcProc:LPARCHIVERPROC ):BOOL; override; function GetWriteTimeEx ( hArc:THArc;var lpLastWriteTime:TFileTime ):BOOL; override; function GetCreateTimeEx( hArc:THArc;var lpCreateTime :TFileTime ):BOOL; override; function GetAccessTimeEx( hArc:THArc;var lpAccessTime :TFileTime ):BOOL; override; function GetArchiveType( lpszFileName:PAnsiChar ):integer; override; end; const ruNothing:TResFileUse = TResFileUse(-1); function DetectArchiverType( ArchiveFileName:string;DetectByFileExt:boolean ):TArchiverType; {$IFNDEF VER93} // not C++Builder 1 ? procedure ReleaseArchiverDLL; {$ENDIF} function ArchiverCheck( ArchiverResult:integer ):integer; function ArchiverErrorMsg( ArchiverResult:integer ):string; //--------------------------------------------------------------------- function GetProcAddr( var EntryPoint:FARPROC;hModule:HMODULE;lpszProcName:string;RaiseException:boolean ):boolean; function ArrayToList( FileList:array of const ):TStringList; procedure Register; implementation {$OPTIMIZATION ON} {$BOOLEVAL OFF} uses {$IFDEF ARCDLL} AllocWin, {$ELSE} Forms, {$ENDIF} {$IFDEF D6_OR_LATER} Variants, {$ENDIF} Lha32, Zip32, Cab32, Arj32, Tar32, Rar32, Bga32, {$IFDEF USEGCA} GCA32, {$ENDIF} {$IFDEF USEBEL} Bel32, {$ENDIF} {$IFDEF USEYZ1} YZ132, {$ENDIF} Filters; {$IFNDEF VER90} // not Delphi 2 ? {$IFNDEF VER100} // not Delphi 3 ? {$HPPEMIT '#include "arcstubs.h"'} {$ObjExportAll On} {$ENDIF} {$ENDIF} //--------------------------------------------------------------------- constructor TArchiverOptions.Create; begin inherited Create; Fjx := TStringList.Create; // jx[<âtâ@âCâïû╝>] Å£èOé╖éΘâtâ@âCâïû╝ init; end; destructor TArchiverOptions.Destroy; begin Fjx.Free; inherited Destroy; end; procedure TArchiverOptions.init; begin Fa := aoiUnAssigned; // a[0|1|2] æ«É½é╠ì─î╗üB Fc := aoiUnAssigned; // c[0|1] â^âCâÇâXâ^âôâvîƒì╕é≡Å╚ù¬ // Fd := aoiUnAssigned; // d[0|1] âfâBâîâNâgâèû╝é╠èiö[ Fe := aoiUnAssigned; // e[0|1] ĽÅæâTâCâYé≡ö╝ò¬é╔é╡é─ê│Åk Ff := aoiUnAssigned; // f[0|1] âfâBâXâNÄcù╩â`âFâbâNé╠ÆåÄ~ Fh := aoiUnAssigned; // h[0|1|2|3] âwâbâ_é╠î`Ä«é≡ÄwÆΦ Fi := aoiUnAssigned; // i[0|1|2] âtâ@âCâïæIæ≡é┼æσò╢ÄÜé╞żò╢ÄÜé≡ïµò╩ Fl := aoiUnAssigned; // l[0|1|2] ôWèJâìâOé╠âtâ@âCâïû╝é╠ò\Īû@é╠ò╧ìX Fm := aoiUnAssigned; // m[0|1|2] Ä┐ûΓé╔ yes é╞ë╝ÆΦ Fn := aoiUnAssigned; // n[0|1] ôWèJÅ≤ï╡â_âCâAâìâOò\Īé╠ù}Ä~ Fo := aoiUnAssigned; // o[0|1|2] ïîî`Ä«é┼Åæî╔é≡ì∞ɼ Fp := aoiUnAssigned; // p[0|1|2] æSâpâXû╝é┼ìçÆv Fr := aoiUnAssigned; // r[0|1|2] ì─ïAôIîƒì⌡ Fs := aoiUnAssigned; // s[0|1] âXâLâbâvò\Īé╠ù}ɺ Ft := aoiUnAssigned; // t[0|1] Åæî╔é╠ìXÉVô·Ä₧é╠ÄwÆΦ Fu := aoiUnAssigned; // u[0|1] âtâ@âCâïé╠ìXÉVüiÉVé╡éóéαé╠üj Fw := aosUnAssigned; // w[0|1|<Dirû╝>] ì∞ï╞ùpâfâBâîâNâgâèé╠ÄwÆΦ Fx := aoiUnAssigned; // x[0|1] âfâBâîâNâgâèû╝é≡ùLî°é╔é╖éΘ Fy := aoiUnAssigned; // y[0|1] æSé─é╠Ä┐ûΓé╔ yes é╞ë╝ÆΦ Fz := aoiUnAssigned; // z[0|1|2|<ègÆúÄq>] ûóê│Åkâtâ@âCâïé╠ÄwÆΦ ###ègÆúÄqé═âTâ|ü[âgé╡é╚éó### Fjc := aoiUnAssigned; // jc[0|1] öjæ╣âwâbâ_é≡û│Äï Fjd := aoiUnAssigned; // jd[<âTâCâY>] âfâBâXâNé╠ï≤é½ùeù╩é≡èmöF Fje := aoiUnAssigned; // je[<âTâCâY>] Huffman âoâbâtâ@é╠æσé½é│é≡ÄwÆΦ Fjf := aoiUnAssigned; // jf[0|1] âïü[âgïLìåé╠ìφÅ£ Fjh := aoiUnAssigned; // jh[0|1] WindowsNT/95 ÉΩùpé╠â}ü[âNé≡Åæî╔é╔òtë┴ Fji := aoiUnAssigned; // ji[0|1] ÆZéóâtâ@âCâïû╝é┼èiö[ Fjm := aoiUnAssigned; // jm[0|1|2|3|4] ê│Åkî`Ä«é≡ÄwÆΦ Fjn := aoiUnAssigned; // jn[0|1] ÉVïKâtâ@âCâïé╠é▌ Fjo := aosUnAssigned; // jo[<Ä₧ìÅÄwÆΦ>] YYMMDDHHMMSS é╠ô·òtê╚ì~ Fjob := aosUnAssigned; // job[<Ä₧ìÅÄwÆΦ>] YYMMDDHHMMSS é╠ô·òtê╚æO Fjp := aoiUnAssigned; // jp[0|1] ÉiÆ╗âoü[é≡âvâìâOâîâXüEâoü[é┼ò\Ī Fjr := aoiUnAssigned; // jr[0|1] âtâ@âCâïé╠Æué½è╖éª Fjsb := aoiUnassigned; // jsb[0|1] âüâbâZü[âWâïü[âvé≡ë±é│é╚éó Fjsc := aoiUnassigned; // jsc[0|1] ôWèJé┼é½é╚é⌐é┴é╜âtâ@âCâïÉöé≡ò╘é╖ Fjsd := aoiUnassigned; // jsd[0|1] ï≤é½ùeù╩ĵô╛é╔Ä╕ösé╡é╜ÅΩìçé╠Åêù¥é≡ÄwÆΦ Fjse := aoiUnassigned; // jse[0|1] ôWèJÄ₧é╠ÅπÅæé½âIü[âvâôôÖé≡âGâëü[é╞é╖éΘ Fjsf := aoiUnassigned; // jsf[0|1] â^âCâÇâXâ^âôâvé╠òΓÉ│é≡ìséφé╚éó Fjsl := aoiUnassigned; // jsl[0|1] ê│ÅküEèiö[âtâ@âCâïé╠Ådòíâ`âFâbâNé≡ìséφé╚éó Fjso := aoiUnassigned; // jso[0|1] SH_DENYNO é┼é╠âIü[âvâôé≡ìséφé╚éó Fjss := aoiUnassigned; // jss[0|1] ïñùLâGâëü[é╠ÅΩìçé╔Åêù¥é≡æ▒ìs Fjst := aoiUnassigned; // jst[0|1] FILETIME ì\æóæ╠âwâbâ_é╠èiö[é≡Å╚ù¬ Fjsv := aoiUnassigned; // jsv[0|1] Åæî╔æÇì∞îπé╔Åæî╔é≡â`âFâbâN Fjsz := aoiUnassigned; // jsz[0|1] żò╢ÄÜé╠ègÆúÄqé≡òtë┴ Fjw := aoiUnAssigned; // jw[0|1|2|3|4] WinSFX/WinSFXM é≡ì∞ɼ Fjx.Clear; // jx[<âtâ@âCâïû╝>] Å£èOé╖éΘâtâ@âCâïû╝ Fjyc := aoiUnAssigned; // jyc[0|1] âfâBâîâNâgâèì∞ɼé╠èmöFé≡Å╚ù¬ Fjyd := aoiUnAssigned; // jyd[0|1] âtâ@âCâïìφÅ£é╠èmöFé≡Å╚ù¬ Fjyk := aoiUnAssigned; // jyk[0|1] Ägùpé┼é½éΘâfâBâXâNùeù╩é╠èmöFé╠Å╚ù¬ Fjyn := aoiUnAssigned; // jyn[0|1] ÉVâtâ@âCâïû╝é╠ùvïüé╠Å╚ù¬ Fjyo := aoiUnAssigned; // jyo[0|1] è∙æ╢âtâ@âCâïé╓é╠ÅπÅæé½èmöFé╠Å╚ù¬ Fjz := aosUnAssigned; // jz[<âtâ@âCâïû╝>] âtâ@âCâïÆìÄ▀é╠âtâ@âCâïé≡ïƒïï Fga := aoiUnAssigned; // ga[0|1] Åæé½ì₧é▌òsë┬æ«É½é≡û│Äï Fgd := aoiUnAssigned; // gd[0|1] ù]ò¬é╚âfü[â^é╠ìφÅ£ Fge := aoiUnAssigned; // ge[0|1] ì┼Åëé╠ègÆúÄqé≡öFÄ» Fgf := aoiUnAssigned; // gf[0|1|2] é╖é┼é╔éáéΘâtâ@âCâïé╠ìXÉV Fgj := aoiUnAssigned; // gj[0|1] x û╜ù▀é≡ e û╜ù▀é╞ô»ùlé╞î⌐é╚é╖ Fgm := aoiUnAssigned; // gm[0|1] âGâëü[âüâbâZü[âWò\Īé╠ù}Ä~ Fgn := aoiUnAssigned; // gn[0|1|2] ôWèJâtâ@âCâïé╠ìçîvâTâCâYé≡ 100% é╞é╡é╜ÉiÆ╗âOâëâté╠ò\Ī Fgo := aoiUnAssigned; // go[0|1] â_âCâAâìâOé╠âIü[âiü[âEâBâôâhâEé╠ÄwÆΦ Fgp := aoiUnAssigned; // gp[0|1] âEâBâôâhâEé≡ Disable é╔é╡é╚éó Fgr := aosUnAssigned; // gr[<âtâ@âCâïû╝>] ò╧ìXâtâ@âCâïû╝é≡ïƒïï Fgs := aoiUnAssigned; // gs[<âTâCâY>] âwâbâ_îƒì⌡âTâCâYé╠ÄwÆΦ Fgu := aoiUnAssigned; // gu[0|1] WinSFXüCDosSFX é╔æSé─é╠âtâ@âCâïé≡èiö[ Fgw := aoiUnAssigned; // gw[0|1|2|3|4] WinSFX32/WinSFX32M é≡ì∞ɼ FUserOptions := ''; // Æ╝É┌ÄwÆΦé╠âIâvâVâçâô FUserFileList := ''; // Æ╝É┌ÄwÆΦé╠âtâ@âCâïâèâXâg FPackFilter := pfComponent; // Åæî╔É╢ɼÄ₧ÄgùpâtâBâïâ^é╠ÄwÆΦ FResFileName := ''; // âîâXâ|âôâXâtâ@âCâïû╝é╠ÄwÆΦ FResFileUsage := [ruOnPack,ruOnUnpack,ruOnRemoveItem]; end; procedure TArchiverOptions.AssignTo( Dest:TPersistent ); var Dst: TArchiverOptions; begin if Dest is TArchiverOptions then begin Dst := Dest as TArchiverOptions; Dst.Fa := Fa; Dst.Fc := Fc; // Dst.Fd := Fd; Dst.Fe := Fe; Dst.Ff := Ff; Dst.Fh := Fh; Dst.Fi := Fi; Dst.Fl := Fl; Dst.Fm := Fm; Dst.Fn := Fn; Dst.Fo := Fo; Dst.Fp := Fp; Dst.Fr := Fr; Dst.Fs := Fs; Dst.Ft := Ft; Dst.Fu := Fu; Dst.Fw := Fw; Dst.Fx := Fx; Dst.Fy := Fy; Dst.Fz := Fz; Dst.Fjc := Fjc; Dst.Fjd := Fjd; Dst.Fje := Fje; Dst.Fjf := Fjf; Dst.Fjh := Fjh; Dst.Fji := Fji; Dst.Fjm := Fjm; Dst.Fjn := Fjn; Dst.Fjo := Fjo; Dst.Fjob := Fjob; Dst.Fjp := Fjp; Dst.Fjr := Fjr; Dst.Fjsb := Fjsb; Dst.Fjsc := Fjsc; Dst.Fjsd := Fjsd; Dst.Fjse := Fjse; Dst.Fjsf := Fjsf; Dst.Fjsl := Fjsl; Dst.Fjso := Fjso; Dst.Fjss := Fjss; Dst.Fjst := Fjst; Dst.Fjsv := Fjsv; Dst.Fjsz := Fjsz; Dst.Fjw := Fjw; Dst.Fjx.Assign( Fjx ); Dst.Fjyc := Fjyc; Dst.Fjyd := Fjyd; Dst.Fjyk := Fjyk; Dst.Fjyn := Fjyn; Dst.Fjyo := Fjyo; Dst.Fjz := Fjz; Dst.Fga := Fga; Dst.Fgd := Fgd; Dst.Fge := Fge; Dst.Fgf := Fgf; Dst.Fgj := Fgj; Dst.Fgm := Fgm; Dst.Fgn := Fgn; Dst.Fgo := Fgo; Dst.Fgp := Fgp; Dst.Fgr := Fgr; Dst.Fgs := Fgs; Dst.Fgu := Fgu; Dst.Fgw := Fgw; Dst.FUserOptions := FUserOptions; Dst.FUserFileList := FUserFileList; Dst.FPackFilter := FPackFilter; Dst.FResFileName := FResFileName; exit; end; inherited; end; //--------------------------------------------------------------------- constructor TArchiver.Create; begin inherited Create; LoadDLL; // âìü[âhé╖éΘé╜é▀é╞î╛éñéµéΦé═âAü[âJâCâoécékékùLû│é╠â`âFâbâNé╠é╜é▀ end; destructor TArchiver.Destroy; begin inherited Destroy; // Åêù¥ìéæ¼ë╗é╠é╜é▀ DLL é╠èJò·é═ìsé╚éφé╚éó end; class procedure TArchiver.LoadDll; begin raise EArchiver.Create( 'Abstract method ''TArchiver.LoadDLL'' was called' ); // é┐éσé┴é╞âEâ\ end; class procedure TArchiver.FreeDll; begin raise EArchiver.Create( 'Abstract method ''TArchiver.FreeDLL'' was called' ); // é┐éσé┴é╞âEâ\ end; {$IFNDEF VER93} // not C++Builder 1 ? class procedure TArchiver.ReleaseDLL; begin FreeDLL; end; {$ENDIF} function TArchiver.FindOpen( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ):THARC; begin result := 0; // not opened end; function TArchiver.FindClose( hArc:THArc ):integer; begin result := 0; // nothing to do end; function TArchiver.FindFirst( hArc:THArc;var IndivisualInfo:TIndivisualInfo;FileMask:string ):integer; begin result := -1; // done end; function TArchiver.FindNext( hArc:THArc;var IndivisualInfo:TIndivisualInfo ):integer; begin result := -1; // done end; function TArchiver.PackFiles( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir: String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; begin raise EArchiver.Create( 'é▒é╠î`Ä«é┼é═Åæî╔âtâ@âCâïé╠ì∞ɼé≡âTâ|ü[âgé╡é─é¿éΦé▄é╣é±üB' ); end; function TArchiver.RemoveItems( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; begin raise EArchiver.Create( 'é▒é╠î`Ä«é╠Åæî╔é┼é═âtâ@âCâïé╠ìφÅ£é≡âTâ|ü[âgé╡é─é¿éΦé▄é╣é±üB' ); end; function TArchiver.UpdateArchive( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; begin raise EArchiver.Create( 'é▒é╠î`Ä«é╠Åæî╔é┼é═Åæî╔é╠ìXÉVé≡âTâ|ü[âgé╡é─é¿éΦé▄é╣é±üB' ); end; function TArchiver.MakeSfx( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;DstPath:String;var Output:string ):Integer; begin raise EArchiver.Create( 'é▒é╠î`Ä«é┼é═Ä⌐î╚ë≡ôÇÅæî╔é╠ì∞ɼé≡âTâ|ü[âgé╡é─é¿éΦé▄é╣é±üB' ); end; function TArchiver.UnpackToMem( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD ):Integer; begin raise EArchiver.Create( 'é▒é╠î`Ä«é┼é═âüâéâèé╓é╠ôWèJé≡âTâ|ü[âgé╡é─é¿éΦé▄é╣é±üB' ); end; function TArchiver.CheckArchive( ArchiveFileName:string;CheckMode:integer;CheckOptions:integer ):DWORD; begin raise EArchiver.Create( 'é▒é╠î`Ä«é┼é═Åæî╔â`âFâbâNï@ö\é≡âTâ|ü[âgé╡é─é¿éΦé▄é╣é±üB' ); end; function TArchiver.SetOwnerWindowEx( Handle:HWND;lpArcProc:LPARCHIVERPROC ):boolean; begin FOwnerWindow := Handle; result := false; end; function TArchiver.KillOwnerWindowEx( Handle:HWND ):boolean; begin FOwnerWindow := 0; result := false; end; function TArchiver.CallBackEnabled: boolean; begin result := FOwnerWindow <> 0; end; procedure TArchiver.AddFileSpec1( CmdLine:TCmdOpt;ArchiveFileName:string;path:string ); begin CmdLine.AddFName1( '',ArchiveFileName ); CmdLine.AddPath1 ( '',Path ); end; function TArchiver.AddFileSpec2( CmdLine:TCmdOpt;Options:TArchiverOptions;FileList:array of const;UseResFile:boolean ):integer; begin if( UseResFile )and( Options.ResFileName <> aosUnassigned )and( Options.ResFileName <> '' ) then begin Result := CmdLine.MakeResFile( FileList,Options.ResFileName ); end else begin Result := CmdLine.AddFList2( '',FileList ); end; CmdLine.Add( Options.UserFileList ); end; procedure TArchiver.BeforePack; begin LoadDLL; // DLL é╠ùLû│é≡èmöFé╖éΘ end; //--------------------------------------------------------------------- constructor TArchiveFile.Create( AOwner:TComponent ); begin inherited Create( AOwner ); FOptions := TArchiverOptions.Create; FArchiverType := atAutoDetect; FFileName := aosUnAssigned; FArchiver := nil; FHArc := 0; end; destructor TArchiveFile.Destroy; begin if FOwnerWindow <> 0 then DeallocateHWnd( FOwnerWindow ); FArchiver.Free; FOptions.Free; inherited Destroy; end; procedure TArchiveFile.CheckArchiverType; begin if FArchiver=nil then raise EArchiver.Create( 'Åæî╔é╠î`Ä«é≡ö╗ò╩é┼é½é▄é╣é±üB' ); end; function TArchiveFile.UnpackFiles( Handle:HWND;Options:TArchiverOptions;DstPath:String;FileList:array of const ):Integer; begin try CheckArchiverType; EnableEvents; if Options = nil then Options := FOptions; result := FArchiver.UnpackFiles( Handle,FFileName,Options,DstPath,FileList,ruOnUnpack in Options.ResFileUsage,FOutputBuff ); finally FCmdLine := FArchiver.CmdLine; DisableEvents; end; end; function TArchiveFile.UnpackToMem( Handle:HWND;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD ):Integer; begin try CheckArchiverType; EnableEvents; if Options = nil then Options := FOptions; result := FArchiver.UnpackToMem( Handle,FFileName,Options,FileName,lpvBuffer,dwSize,lpdwWriteSize ); finally FCmdLine := FArchiver.CmdLine; DisableEvents; end; end; function TArchiveFile.PackFiles( Handle:HWND;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer; function DoPack( Options:TArchiverOptions;FileList:array of const ):integer; begin try EnableEvents; Result := FArchiver.PackFiles( Handle,FFileName,Options,BaseDir,FileList,ruOnPack in Options.ResFileUsage,FOutputBuff ); finally FCmdLine := FArchiver.CmdLine; DisableEvents; end; end; var TmpFileList: TStrings; TmpOptions: TArchiverOptions; FilterAborted: boolean; begin DetectArchiverType; CheckArchiverType; if Options = nil then Options := FOptions; FArchiver.BeforePack; // âAü[âJâCâoDLLé╠æ╢ì▌é≡èmöF if Options.PackFilter = pfComponent then begin TmpOptions := TArchiverOptions.Create; TmpFileList := nil; try FilterAborted := False; TmpOptions.Assign( Options ); TmpFileList := PackFileFilter( DoProgress,TmpOptions,BaseDir,FileList,FilterAborted ); if FilterAborted then begin Result := ERROR_USER_CANCEL; exit; end; if( TmpFileList is TStrings )and( TmpFileList.Count > 0 ) then begin TmpOptions.jx.clear; Result := DoPack( TmpOptions,[TmpFileList] ) end else begin if Length( FOutputBuff ) > 0 then FOutputBuff[1] := #0; Result := 0; end; finally TmpFileList.Free; TmpOptions .Free; end; end else begin Result := DoPack( Options,FileList ); end; FCmdLine := FArchiver.CmdLine; end; function TArchiveFile.RemoveItems( Handle:HWND;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer; begin try DetectArchiverType; CheckArchiverType; EnableEvents; if Options = nil then Options := FOptions; result := FArchiver.RemoveItems( Handle,FFileName,Options,BaseDir,FileList,ruOnRemoveItem in Options.ResFileUsage,FOutputBuff ); finally FCmdLine := FArchiver.CmdLine; DisableEvents; end; end; function TArchiveFile.UpdateArchive( Handle:HWND;Options:TArchiverOptions;BaseDir:String;FileList:array of const ):Integer; begin try DetectArchiverType; CheckArchiverType; EnableEvents; if Options = nil then Options := FOptions; result := FArchiver.UpdateArchive( Handle,FFileName,Options,BaseDir,FileList,ruOnUpdate in Options.ResFileUsage,FOutputBuff ); finally FCmdLine := FArchiver.CmdLine; DisableEvents; end; end; function TArchiveFile.MakeSfx( Handle:HWND;Options:TArchiverOptions;DstPath :String ):Integer; begin try CheckArchiverType; EnableEvents; if Options = nil then Options := FOptions; result := FArchiver.MakeSfx( Handle,FFileName,Options,DstPath,FOutputBuff ); finally if Assigned( FArchiver ) then begin FCmdLine := FArchiver.CmdLine; end else begin FCmdLine := ''; end; DisableEvents; end; end; function TArchiveFile.CheckArchive( CheckMode:integer;CheckOptions:integer ):DWORD; begin DetectArchiverType; CheckArchiverType; result := FArchiver.CheckArchive( FFileName,CheckMode,CheckOptions ); end; { function TArchiveFile.UnpackTo( Handle:HWND;DstPath:String;FileList:TStrings ):Integer; begin result := UnpackFiles( Handle,nil,DstPath,FileList ); end; function TArchiveFile.PackTo( Handle:HWND;BaseDir:String;FileList:TStrings ):Integer; begin result := PackFiles( Handle,nil,BaseDir,FileList ); end; function TArchiveFile.RemoveItem( Handle:HWND;BaseDir:String;FileList:TStrings ):Integer; begin result := RemoveItems( Handle,nil,BaseDir,FileList ); end; function TArchiveFile.MakeSfxFile( Handle:HWND;DstPath:String ):Integer; begin result := MakeSfx( Handle,nil,DstPath ); end; } procedure TArchiveFile.DetectArchiverType; begin if FArchiverType <> atAutoDetect then exit; SetArchiverType( Archives.DetectArchiverType( FFileName,false )); end; procedure TArchiveFile.SetFileName( ArchiveFileName:TFileName ); begin SetArchiverType( Archives.DetectArchiverType( ArchiveFileName,true )); FFileName := ArchiveFileName; end; procedure TArchiveFile.SetArchiverType( ArchiverType:TArchiverType ); procedure SetArchiver( Archiver:TArchiver ); begin FArchiver.Free; FArchiver := Archiver; end; begin if not( csDesigning in ComponentState ) then begin case ArchiverType of atLha: SetArchiver( TLha32.Create ); atZip: SetArchiver( TZip32.Create ); atCab: SetArchiver( TCab32.Create ); atArj: SetArchiver( TArj32.Create ); atTar: SetArchiver( TTar32.Create ); atTgz: SetArchiver( TTgz32.Create ); atBZ2: SetArchiver( TBZ232.Create ); atRar: SetArchiver( TRar32.Create ); atBga: SetArchiver( TBGA32.Create ); {$IFDEF USEGCA} atGca: SetArchiver( TGCA32.Create ); {$ENDIF} {$IFDEF USEBEL} atBel: SetArchiver( TBel32.Create ); {$ENDIF} {$IFDEF USEYZ1} atYz1: SetArchiver( TYZ1.Create ); {$ENDIF} atAutoDetect: // éáé╞é┼É▌ÆΦé╖éΘ ; atNone: // ò╧ìXé╡é╚éó exit; else if not ( csReading in ComponentState ) then raise EArchiver.Create( 'Åæî╔é╠î`Ä«é≡ô┴ÆΦé┼é½é▄é╣é±é┼é╡é╜üB' ); end; end; FArchiverType := ArchiverType; end; function TArchiveFile.FindOpen( Handle:HWND;dwMode:DWORD ):integer; begin DetectArchiverType; CheckArchiverType; FHArc := FArchiver.FindOpen( Handle,FFileName,dwMode ); if FHArc = 0 then Result := 1 else Result := 0; end; function TArchiveFile.FindClose:integer; begin Result := FArchiver.FindClose( FHArc ); FHArc := 0; end; function TArchiveFile.FindFirst( FileMask:string;var IndivisualInfo:TIndivisualInfo ):integer; begin result := FArchiver.FindFirst( FHArc,IndivisualInfo,FileMask ); end; function TArchiveFile.FindNext( var IndivisualInfo:TIndivisualInfo ):integer; begin result := FArchiver.FindNext( FHArc,IndivisualInfo ); end; procedure TArchiveFile.SetOutputSize( OutputSize:integer ); begin SetLength( FOutputBuff,OutputSize ); // Åoù═âüâbâZü[âWé≡èiö[é╖éΘâoâbâtâ@ if OutputSize > 0 then FOutputBuff[1] := #0; // FOutputSize := OutputSize; // Åoù═âüâbâZü[âWâoâbâtâ@é╠âTâCâY end; function TArchiveFile.GetOutputSize:integer; begin result := Length( FOutputBuff ); end; function TArchiveFile.GetOutput:string; begin result := FOutputBuff; end; //----------------------------------------------------------------------------------------- procedure TArchiveFile.ArchiverWndProc( var Message:TMessage ); var State: UINT; lpEis: LPExtractingInfoEx; Abort: boolean; begin if Message.Msg = WM_ARCEXTRACT then begin State := Message.wParam; lpEis := LPExtractingInfoEx( Message.lParam ); Abort := False; DoProgress( State,lpEis,Abort ); if Abort then Message.Result := 1 // Åêù¥ÆåÄ~ else Message.Result := 0; // Åêù¥æ▒ìs end else begin Message.Result := DefWindowProc( FOwnerWindow,Message.Msg,Message.wParam,Message.lParam ); end; end; procedure TArchiveFile.DoProgress( State:UINT;lpEis:LPExtractingInfoEx;var Abort:boolean ); begin if Assigned( FOnProgress ) then begin FOnProgress( Self,State,lpEis,Abort ); end; end; procedure TArchiveFile.EnableEvents; begin if not Assigned( FOnProgress ) then exit; if WM_ARCEXTRACT = 0 then WM_ARCEXTRACT := RegisterWindowMessage( lpszWMARCEXTRACT ); if FOwnerWindow = 0 then FOwnerWindow := AllocateHWnd( ArchiverWndProc ); try FArchiver.SetOwnerWindowEx( FOwnerWindow,nil ); except ; end; end; procedure TArchiveFile.DisableEvents; begin if not Assigned( FOnProgress ) then exit; try FArchiver.KillOwnerWindowEx( FOwnerWindow ); except ; end; end; //----------------------------------------------------------------------------------------- constructor TCmdOpt.Create; begin FCmdLine := ''; FFormat := cfInner; end; procedure TCmdOpt.Add( optstr:string ); begin FCmdLine := FCmdLine + ' ' + OptStr; end; procedure TCmdOpt.AddStrOpt( optstr:string;value:string ); begin if value = aosUnAssigned then exit; if optstr = '' then begin Add( '"' + value + '"' ); end else begin if optstr[1] = ' ' then begin optstr := copy( optstr,2,MaxInt ); end else begin optstr := '-'+optstr; end; if FFormat = cfInner then begin Add( '"' + optstr + value + '"' ); end else begin Add( optstr + ' "' + value + '"' ); end; end; end; procedure TCmdOpt.AddIntOpt( optstr:string;value:integer ); begin if value > aoiUnAssigned then Add( '-'+optstr+IntToStr( value )); end; procedure TCmdOpt.AddIntDef( optstr:string;value:integer;defaultopt:integer ); begin if value <> aoiUnAssigned then begin if value = defaultopt then begin Add( '-'+optstr ); end else begin Add( '-'+optstr+IntToStr( value )); end; end; end; procedure TCmdOpt.AddBolOpt( optstr:string;value:boolean ); begin if( value ) then Add( '-'+optstr ); end; procedure TCmdOpt.AddFName1( optstr,filespec:string ); begin AddStrOpt( optstr,filespec ); end; procedure TCmdOpt.AddPath1( optstr,pathspec:string ); begin if pathspec = '' then exit; if pathspec = aosUnAssigned then exit; if AnsiLastChar( pathspec ) <> '\' then AddFName1( optstr,pathspec+'\' ) else AddFName1( optstr,pathspec ); end; procedure TCmdOpt.AddFName2( optstr,filespec:string ); begin AddFName1( optstr,Filtered( filespec )); end; function ArrayToList( FileList:array of const ):TStringList; procedure AddResult( FileName:string ); begin if FileName='' then exit; Result.Add( FileName ); end; var aFileList: TStrings; PFileList: ^PChar; i: integer; j: integer; begin Result := TStringList.Create; for j := Low( FileList ) to High( FileList ) do begin with FileList[j] do begin case VType of vtObject: if VObject is TStrings then begin aFileList := VObject as TStrings; for i := 0 to aFileList.Count-1 do begin AddResult( aFileList[i] ); end; end; vtPointer: if VPointer <> nil then begin PFileList := VPointer; while PFileList^ <> nil do begin AddResult( PFileList^ ); Inc( PFileList ); end; end; vtPChar: AddResult( VPChar ); vtString: AddResult( VString^ ); vtAnsiString: AddResult( string( VAnsiString )); {$IFNDEF VER90} // not Delphi 2 ? vtWideString: AddResult( string( VWideString )); {$ENDIF} vtVariant: if VarIsArray( VVariant^ ) then begin for i := VarArrayLowBound( VVariant^,1 ) to VarArrayHighBound( VVariant^,1 ) do begin AddResult( VVariant^[i] ); end; end else begin AddResult( string( VVariant^ )); end; end; end; end; end; function TCmdOpt.AddFList2( optstr:string;FileList:array of const ):integer; var FileList2: TStringList; i: integer; begin FileList2 := ArrayToList( FileList ); try for i := 0 to FileList2.Count-1 do begin AddFName2( optstr,FileList2[i] ); end; Result := FileList2.Count; finally FileList2.Free; end; end; function TCmdOpt.Filtered( S:string ):string; begin if Assigned( FFilterProc ) then Result := FFilterProc( S ) else Result := S; end; function TCmdOpt.MakeResFile( FileList:array of const;ResFileName:string ):integer; var FileList2: TStringList; Stream: TStream; S: string; i: integer; begin FileList2 := ArrayToList( FileList ); Stream := TFileStream.Create( ResFileName,fmCreate ); try for i:=0 to FileList2.Count-1 do begin S := S + '"' + Filtered( FileList2[i] ) + '"'#13#10 end; Stream.WriteBuffer( PChar( S )^,Length( S )); Result := FileList2.Count; finally FileList2.Free; Stream.Free; end; AddFName1( '','@'+ResFileName ) end; //----------------------------------------------------------------------------------------- function DetectArchiverType( ArchiveFileName:string;DetectByFileExt:boolean ):TArchiverType; var FileExt: string; begin result := atNone; if DetectByFileExt // ègÆúÄqé┼ö╗Æf then begin FileExt := ExtractFileExt( ArchiveFileName ); if CompareText( FileExt, '.z' )=0 then result := atTgz; if CompareText( FileExt, '.gz' )=0 then result := atTgz; if CompareText( FileExt, '.tgz' )=0 then result := atTgz; if CompareText( FileExt, '.taz' )=0 then result := atTgz; if CompareText( FileExt, '.a' )=0 then result := atTar; if CompareText( FileExt, '.lib' )=0 then result := atTar; if CompareText( FileExt, '.tar' )=0 then result := atTar; if CompareText( FileExt, '.deb' )=0 then result := atTar; if CompareText( FileExt, '.rpm' )=0 then result := atTar; if CompareText( FileExt,'.cpio' )=0 then result := atTar; if CompareText( FileExt, '.bz2' )=0 then result := atBZ2; if CompareText( FileExt, '.gza' )=0 then result := atBga; if CompareText( FileExt, '.bza' )=0 then result := atBga; if CompareText( FileExt, '.gca' )=0 then result := atGCA; {$IFDEF USEYZ1} if CompareText( FileExt, '.yz1' )=0 then result := atYz1; {$ENDIF} {$IFDEF USEBEL} if CompareText( FileExt, '.bel' )=0 then result := atBel; {$ENDIF} if CompareText( FileExt, '.rar' )=0 then result := atRar; if CompareText( FileExt, '.arj' )=0 then result := atArj; if CompareText( FileExt, '.zip' )=0 then result := atZip; if CompareText( FileExt, '.cab' )=0 then result := atCab; if CompareText( FileExt, '.lzh' )=0 then result := atLha; if CompareText( FileExt, '.exe' )=0 then result := DetectArchiverType( ArchiveFileName,false ); end else begin result := IsTarArchive( ArchiveFileName ); if IsRarArchive( ArchiveFileName ) then result := atRar; if IsArjArchive( ArchiveFileName ) then result := atArj; if IsZipArchive( ArchiveFileName ) then result := atZip; if IsBgaArchive( ArchiveFileName ) then result := atBga; {$IFDEF USEYZ1} if IsYz1Archive( ArchiveFileName ) then result := atYz1; {$ENDIF} if IsCabArchive( ArchiveFileName ) then result := atCab; if IsLhaArchive( ArchiveFileName ) then result := atLha; end; end; function GetProcAddr( var EntryPoint:FARPROC;hModule:HMODULE;lpszProcName:string;RaiseException:boolean ):boolean; var szDllName: array[0..256] of Char; begin result := true; if EntryPoint <> nil then exit; EntryPoint := GetProcAddress( hModule,PChar( lpszProcName )); if EntryPoint <> nil then exit; GetModuleFileName( hModule,szDllName,sizeof( szDllName )); if RaiseException then raise EEntryNotFound.Create( Format( '%0:s é╔ %1:s é╠âGâôâgâèé¬î⌐é┬é⌐éΦé▄é╣é±üB',[szDllName,lpszProcName] )); result := false; end; //-------------------------------------------------------------------------- constructor TCustomArchiverDll.Create; begin // ë╜éαé╡é╚éó end; destructor TCustomArchiverDll.Destroy; begin FreeDLL; end; procedure TCustomArchiverDll.FreeDll; begin FArchiverProc := nil; FOpenArchive := nil; FCloseArchive := nil; FFindFirst := nil; FFindNext := nil; FExtractMem := nil; FCheckArchive := nil; FSetOwnerWindowEx := nil; FKillOwnerWindowEx := nil; FGetWriteTimeEx := nil; FGetCreateTimeEx := nil; FGetAccessTimeEx := nil; FGetArchiveType := nil; end; function TCustomArchiverDll.ArchiverProc( _hwnd:HWND;_lpszCmdLine:PAnsiChar;_lpszOutput:PAnsiChar;_dwSize:DWORD ):integer; begin if _dwSize = 0 then _lpszOutput := nil; result := TArcDLLArchiverProc( FArchiverProc )( _hwnd,_lpszCmdLine,_lpszOutput,_dwSize ); end; function TCustomArchiverDll.OpenArchive( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ):THARC; begin result := TArcDLLFindOpen( FOpenArchive )( Handle,PAnsiChar( ArchiveFileName ),dwMode ); end; function TCustomArchiverDll.CloseArchive( hArc:THARC ):integer; begin result := TArcDLLFindClose( FCloseArchive )( hArc ); end; function TCustomArchiverDll.FindFirst( hArc:THArc;FileMask:string;IndivisualInfo:PIndivisualInfo ):integer; begin result := TArcDLLFindFirst( FFindFirst )( hArc,PAnsiChar( FileMask ),IndivisualInfo ); if result = 0 then GetAddtitionalInfo( hArc,IndivisualInfo ); end; function TCustomArchiverDll.FindNext( hArc:THArc;IndivisualInfo:PIndivisualInfo ):integer; begin result := TArcDLLFindNext( FFindNext )( hArc,IndivisualInfo ); if result = 0 then GetAddtitionalInfo( hArc,IndivisualInfo ); end; procedure TCustomArchiverDll.GetAddtitionalInfo( hArc:THArc;IndivisualInfo:PIndivisualInfo ); begin with IndivisualInfo^ do begin if GetWriteTimeEx( hArc,WriteTime ) = False then DosDateTimeToFileTime( wDate,wTime,WriteTime ); if GetAccessTimeEx( hArc,AccessTime ) = False then DosDateTimeToFileTime( wDate,wTime,AccessTime ); if GetCreateTimeEx( hArc,CreateTime ) = False then DosDateTimeToFileTime( wDate,wTime,CreateTime ); end; end; function TCustomArchiverDll.CheckArchive( lpszFileName:PAnsiChar;iMode:integer ):DWORD; begin result := TArcDLLCheckArchive( FCheckArchive )( lpszFileName,iMode ); end; function TCustomArchiverDll.SetOwnerWindowEx( Handle:HWND;lpArcProc:LPARCHIVERPROC ):BOOL; begin result := TArcDLLSetOwnerWindowEx( FSetOwnerWindowEx )( Handle,lpArcProc ); end; function TCustomArchiverDll.KillOwnerWindowEx( Handle:HWND ):BOOL; begin result := TArcDLLKillOwnerWindowEx( FKillOwnerWindowEx )( Handle ); end; function TCustomArchiverDll.ExtractMem( Handle:HWND;lpszCmdLine:PAnsiChar;lpvBuffer:LPBYTE;dwSize:DWORD;lpTime:ptime_t;lpwAttr:LPWORD;lpdwWriteSize:LPDWORD ):integer; begin result := TArcDLLExtractMem( FExtractMem )( Handle,lpszCmdLine,lpvBuffer,dwSize,lpTime,lpwAttr,lpdwWriteSize ); end; function CallGetTimeEx( hArc:THArc;GetTimeProc:TArcDLLGetFileTimeEx;var lpFileTime:TFileTime ):BOOL; begin if Assigned( GetTimeProc ) then result := GetTimeProc( hArc,lpFileTime ) else result := false; end; function TCustomArchiverDll.GetWriteTimeEx( hArc:THArc;var lpLastWriteTime:TFileTime ):BOOL; begin result := CallGetTimeEx( hArc,FGetWriteTimeEx,lpLastWriteTime ); end; function TCustomArchiverDll.GetCreateTimeEx( hArc:THArc;var lpCreateTime:TFileTime ):BOOL; begin result := CallGetTimeEx( hArc,FGetCreateTimeEx,lpCreateTime ); end; function TCustomArchiverDll.GetAccessTimeEx( hArc:THArc;var lpAccessTime:TFileTime ):BOOL; begin result := CallGetTimeEx( hArc,FGetAccessTimeEx,lpAccessTime ); end; function TCustomArchiverDll.GetArchiveType( lpszFileName:PAnsiChar ):integer; begin result := TTarDLLGetArchiveType( FGetArchiveType )( lpszFileName ); end; //----------------------------------------- constructor TArchiverDll.Create( ArchiveName,DllName,EntryPrefix:string ); begin inherited Create; FArchiveName := ArchiveName; FDllName := DllName; FEntryPrefix := EntryPrefix; end; destructor TArchiverDll.Destroy; begin FreeDLL; end; procedure TArchiverDll.LoadDll; begin if FhDLL = 0 then FhDLL := Loadlibrary( PChar( FDllName )); if FhDLL <> 0 then exit; raise ENoArchiverDLL.Create( Format( '%0:s é≡ê╡éñé╔é═ %1:s é¬ òKùvé┼é╖üB',[FArchiveName,FDLLName] )); end; procedure TArchiverDll.FreeDll; begin inherited; if FhDLL = 0 then exit; FreeLibrary( FhDLL ); FhDLL := 0; end; function TArchiverDll.ArchiverProc( _hwnd:HWND;_lpszCmdLine:PAnsiChar;_lpszOutput:PAnsiChar;_dwSize:DWORD ):integer; begin LoadDll; GetProcAddr( FArchiverProc,FhDLL,FEntryPrefix,true ); result := inherited ArchiverProc( _hwnd,_lpszCmdLine,_lpszOutput,_dwSize ); end; function TArchiverDll.OpenArchive( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ):THARC; begin LoadDll; GetProcAddr( FOpenArchive,FhDLL,FEntryPrefix+'OpenArchive',true ); result := inherited OpenArchive( Handle,PAnsiChar( ArchiveFileName ),dwMode ); end; function TArchiverDll.CloseArchive( hArc:THARC ):integer; begin LoadDll; GetProcAddr( FCloseArchive,FhDLL,FEntryPrefix+'CloseArchive',true ); result := inherited CloseArchive( hArc ); end; function TArchiverDll.FindFirst( hArc:THArc;FileMask:string;IndivisualInfo:PIndivisualInfo ):integer; begin LoadDll; GetProcAddr( FFindFirst,FhDLL,FEntryPrefix+'FindFirst',true ); result := inherited FindFirst( hArc,PAnsiChar( FileMask ),IndivisualInfo ); end; function TArchiverDll.FindNext( hArc:THArc;IndivisualInfo:PIndivisualInfo ):integer; begin GetProcAddr( FFindNext,FhDLL,FEntryPrefix+'FindNext',true ); result := inherited FindNext( hArc,IndivisualInfo ); end; function TArchiverDll.CheckArchive( lpszFileName:PAnsiChar;iMode:integer ):DWORD; begin LoadDll; GetProcAddr( FCheckArchive,FhDLL,FEntryPrefix+'CheckArchive',true ); result := inherited CheckArchive( lpszFileName,iMode ); end; function TArchiverDll.SetOwnerWindowEx( Handle:HWND;lpArcProc:LPARCHIVERPROC ):BOOL; begin GetProcAddr( FSetOwnerWindowEx,FhDLL,FEntryPrefix+'SetOwnerWindowEx',true ); result := inherited SetOwnerWindowEx( Handle,lpArcProc ); end; function TArchiverDll.KillOwnerWindowEx( Handle:HWND ):BOOL; begin GetProcAddr( FKillOwnerWindowEx,FhDLL,FEntryPrefix+'KillOwnerWindowEx',true ); result := inherited KillOwnerWindowEx( Handle ); end; function TArchiverDll.ExtractMem( Handle:HWND;lpszCmdLine:PAnsiChar;lpvBuffer:LPBYTE;dwSize:DWORD;lpTime:ptime_t;lpwAttr:LPWORD;lpdwWriteSize:LPDWORD ):integer; begin GetProcAddr( FExtractMem,FhDLL,FEntryPrefix+'ExtractMem',true ); result := inherited ExtractMem( Handle,lpszCmdLine,lpvBuffer,dwSize,lpTime,lpwAttr,lpdwWriteSize ); end; function TArchiverDll.GetWriteTimeEx( hArc:THArc;var lpLastWriteTime:TFileTime ):BOOL; begin GetProcAddr( FGetWriteTimeEx,FhDLL,FEntryPrefix+'GetWriteTimeEx',false ); result := inherited GetWriteTimeEx( hArc,lpLastWriteTime ); end; function TArchiverDll.GetCreateTimeEx( hArc:THArc;var lpCreateTime:TFileTime ):BOOL; begin GetProcAddr( FGetCreateTimeEx,FhDLL,FEntryPrefix+'GetCreateTimeEx',false ); result := inherited GetCreateTimeEx( hArc,lpCreateTime ); end; function TArchiverDll.GetAccessTimeEx( hArc:THArc;var lpAccessTime:TFileTime ):BOOL; begin GetProcAddr( FGetAccessTimeEx,FhDLL,FEntryPrefix+'GetAccessTimeEx',false ); result := inherited GetAccessTimeEx( hArc,lpAccessTime ); end; function TArchiverDll.GetArchiveType( lpszFileName:PAnsiChar ):integer; begin LoadDll; GetProcAddr( FGetArchiveType,FhDLL,FEntryPrefix+'GetArchiveType',true ); result := inherited GetArchiveType( lpszFileName ); end; //-------------------------------------------------------------------------- procedure ReleaseArchiverDLL; begin TLha32.ReleaseDLL; // Æ╝É┌ FreeDLL é≡Ägéñé╞îδô«ì∞é╖éΘ TZip32.ReleaseDLL; TCab32.ReleaseDLL; TTar32.ReleaseDLL; TRar32.ReleaseDLL; TArj32.ReleaseDLL; TBga32.ReleaseDLL; {$IFDEF USEGCA} TGca32.ReleaseDLL; {$ENDIF} {$IFDEF USEYZ1} TYz1 .ReleaseDLL; {$ENDIF} {$IFDEF USEBEL} TBel32.ReleaseDLL; {$ENDIF} end; //-------------------------------------------------------------------------- function ArchiverErrorMsg( ArchiverResult:integer ):string; begin result := LoadStr( ArchiverResult + $6000 ); if result <> '' then exit; result := Format( 'ArchiverError %d occured.',[ArchiverResult] ); end; function ArchiverCheck( ArchiverResult:integer ):integer; var Error: EArchiver; begin Result := ArchiverResult; if ArchiverResult > $8000 then begin Error := EArchiver.Create( ArchiverErrorMsg( ArchiverResult )); Error.ErrorCode := ArchiverResult; raise Error; end; end; //-------------------------------------------------------------------------- procedure Register; begin RegisterComponents( 'NORG',[TArchiveFile] ); end; end.