home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 March / Chip_2002-03_cd1.bin / zkuste / delphi / kompon / d5 / cak / CAKINST.ZIP / cmarc139.lzh / ZIP32.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  2001-08-21  |  37.0 KB  |  848 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/M.Yoneda 1997,1998,1999,2000
  4. //
  5. // ZIP32è╓ÿAâéâWâàü[âï    ZIP32.PAS
  6. //
  7. // v1.00:Åëè·î÷èJâoü[âWâçâô
  8. // v1.01:Open/Close âüâ\âbâhé≡ FindOpen/FindClose é╔ëⁿû╝
  9. // v1.02:âtâ@âCâïâèâXâgâpâëâüü[â^é╠î^é≡ TStrings é╔ò╧ìX
  10. //       â^âCâgâïé╠âRâüâôâgé≡Äßè▒ò╧ìX
  11. // v1.03:LMZIP32é╓é╠æ╬ë₧üFêΩùùĵô╛é¬ë┬ö\é╔
  12. //       Delphi 3 é╔æ╬ë₧
  13. // v1.04:LMZIP32é╓é╠æ╬ë₧üFÅæî╔é╠ì∞ɼé¬ë┬ö\é╔
  14. // v1.05:Åæî╔ôαâAâCâeâÇìφÅ£ùpâüâ\âbâhÆ╟ë┴
  15. //       LoadDll/FreeDll é╠ì\ɼò╧ìX
  16. //       Åæî╔âtâ@âCâïö╗ÆΦï@ö\Æ╟ë┴
  17. // v1.06:Åæî╔æÇì∞âüâ\âbâhé╠û▀éΦÆlé¬òsÉ│é╛é┴é╜òsï∩ìçé╠æ╬ì⌠
  18. // v1.09:Update/ExtractTo âüâ\âbâhé≡ PackTo/UnpackTo é╔ëⁿû╝
  19. //       îoë▀â_âCâAâìâOö±ò\ĪâIâvâVâçâôé≡Ä└æò
  20. //       âRâ}âôâhâëâCâôÉ╢ɼé╠òsï∩ìçé≡ÅCÉ│
  21. // v1.11:èeâNâëâXé╠âüâ\âbâhÉΘî╛é╠îδéΦé≡Æ∙É│
  22. //       òsùvò╧Éöé╠ÉΘî╛é≡ìφÅ£
  23. // v1.12:TArchiveFile é╔ Output/OutputSize âvâìâpâeâBé≡Æ╟ë┴
  24. //       ZIP32J.DLL é╠âTâ|ü[âgé≡Æ╟ë┴
  25. //       ôαòöâüâ\âbâhé╠Ä└æòé≡Äßè▒ò╧ìX
  26. // v1.13:UNZIP32.DLL é¬æ╢ì▌é╡é─éα ZIP Åæî╔é¬ë≡ôÇé┼é½é╚é⌐é┴é╜òsï∩ìçé╠ÅCÉ│
  27. //       ôαòöâüâ\âbâhé╠Ä└æòé≡Äßè▒ò╧ìX
  28. // v1.15:ZIP32J é┼é╠ê│ÅkâîâxâïâIâvâVâçâôÉ╢ɼé╠îδéΦé≡Æ∙É│
  29. // v1.16:rüEa âIâvâVâçâôé╠É╢ɼò√û@é≡Æ╟ë┴ü^Æ∙É│
  30. //       ô«ì∞é╡é╚éóé╠é┼ jo/job âIâvâVâçâôé╠âTâ|ü[âgé≡ÆföO
  31. // v1.17:ZIP32J 0.20 é╔æ╬ë₧ü|LMZIP32.DLL é╚é╡é┼êΩùùĵô╛é¬ë┬ö\é╔
  32. //       LoadDll/FreeDll/IsXXXArchive é╠ì\ɼò╧ìX
  33. //       LMZIP32.DLL é┼ê│Åké┼é½é╚é¡é╚é┴é─éóé╜é╠é≡ÅCÉ│
  34. // v1.19:ZIPî`Ä«Åæî╔é⌐éτé╠Ä⌐î╚ë≡ôÇÅæî╔ì∞ɼï@ö\é≡Ä└æò
  35. // v1.20:Ä⌐î╚ë≡ôÇÅæî╔ì∞ɼâpâXÄwÆΦï@ö\Æ╟ë┴
  36. // v1.21:LoadDll/FreeDll é╠ë┬Äïâîâxâïé≡ò╧ìX
  37. // v1.22:îoë▀âCâxâôâgâTâ|ü[âgé≡Æ╟ë┴
  38. // v1.23:CheckArchive âüâ\âbâhé≡Æ╟ë┴
  39. //       Äσé╚âüâ\âbâhé╠ëⁿû╝
  40. // v1.24:âRâ}âôâhâëâCâôé╠âpâXâfâèâ~â^é≡'/'é╔é╡é╜
  41. // v1.25:ZIP32J.DLLé┼é╠û╝æOé╔"["é≡è▄é▐âtâ@âCâïé╓é╠æ╬ë₧
  42. // v1.28:âüâéâèôWèJï@ö\é╠âTâ|ü[âgé≡Æ╟ë┴
  43. //          CheckArchive âüâ\âbâhé╠û▀éΦÆlé╠î^é≡ò╧ìX
  44. // v1.30:èeâüâ\âbâhé╠ FileList ê°Éöé╠î^é≡ò╧ìX
  45. // v1.32:IsZipArchive é╠Ä└æòé≡ò╧ìX
  46. //       IsSetOwnerWinow/KillOwnerWindow é╠Ä└æòé≡ò╧ìX
  47. // v1.33:ôαòöâtâBâïâ^ô«ì∞æOé╠DLLùLû│â`âFâbâNé╠Ä└æòé≡Æ╟ë┴
  48. // v1.35:TZip32.Zip/TZip32.Unzip é¬ CmdLine ê°Éöé≡î⌐é─éóé╚é⌐é┴é╜òsï∩ìçé╠ÅCÉ│
  49. // v1.37:êΩÄ₧âfâBâîâNâgâèÄwÆΦâIâvâVâçâôé╠âTâ|ü[âgé≡Æ╟ë┴
  50. // v1.38:DLL é⌐éτé╠âGâôâgâèâ|âCâôâgé╠ĵô╛ò√û@é≡ò╧ìX
  51. //
  52. unit ZIP32;
  53.  
  54. interface
  55.  
  56. uses Windows,SysUtils,Classes,Archives;
  57.  
  58. type
  59.     TZip32 = class( TArchiver )
  60.     protected
  61.         class procedure LoadDll; override;
  62.         class procedure FreeDll; override;
  63.  
  64.     protected
  65.         function  BuildUnZipCmd( Cmd,ArchiveFileName:string;Options:TArchiverOptions;Path:String;FileList:array of const;UseResFile:boolean ):String;
  66.         function  BuildLMZipCmd( Cmd,ArchiveFileName:string;Options:TArchiverOptions;Path:String;FileList:array of const;UseResFile:boolean ):String;
  67.         function  BuildZipCmd  ( Cmd,ArchiveFileName:string;Options:TArchiverOptions;Path:String;FileList:array of const;UseResFile:boolean ):String;
  68.  
  69.         function  FindOpen ( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ):THARC; override;
  70.         function  FindFirst( hArc:THArc;var IndivisualInfo:TIndivisualInfo;FileMask:string ):integer; override;
  71.         function  FindNext ( hArc:THArc;var IndivisualInfo:TIndivisualInfo                 ):integer; override;
  72.         function  FindClose( hArc:THArc                                                    ):integer; override;
  73.  
  74. //        function  FileSpec( FileName:string ):String; override;
  75.  
  76.     public
  77.         constructor Create;
  78.         function Zip          ( Handle:HWND;CmdLine:string;var Output:string ):Integer;
  79.         function Unzip        ( Handle:HWND;CmdLine:string;var Output:string ):Integer;
  80.         function UnpackFiles  ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;DstPath:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; override;
  81.         function PackFiles    ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; override;
  82.         function RemoveItems  ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; override;
  83.         function UpdateArchive( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; override;
  84.         function MakeSfx      ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;DstPath:String                                     ;var Output:string ):Integer; override;
  85.         function UnpackToMem  ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD   ):Integer; override;
  86.         function CheckArchive (             ArchiveFileName:string;CheckMode:integer;CheckOptions:integer ):DWORD; override;
  87.         function SetOwnerWindowEx ( Handle:HWND;lpArcProc:LPARCHIVERPROC ):boolean; override;
  88.         function KillOwnerWindowEx( Handle:HWND                          ):boolean; override;
  89.     end;
  90.  
  91.     function IsZipArchive( ArchiveFileName:string ):boolean;
  92.  
  93. implementation
  94.  
  95. uses
  96.     Filters;
  97.  
  98. const
  99.     UNZIP32DLL = 'UNZIP32.DLL';
  100.     LMZIP32DLL = 'LMZIP32.DLL';
  101.     ZIP32JDLL  = 'ZIP32J.DLL';
  102.  
  103. type
  104.     TZipDll = class( TCustomArchiverDll )
  105.     private
  106.         function GetZipProc( var EntryPoint:FARPROC;hDLL1,hDLL2,hDLL3:HMODULE;ProcName:string;RaiseException:boolean ):boolean;
  107.         function UnZip(_hwnd:HWND;_lpszCmdLine,_lpszOutput:PAnsiChar;_dwSize:DWORD ):integer;
  108.         function Zip  (_hwnd:HWND;_lpszCmdLine,_lpszOutput:PAnsiChar;_dwSize:DWORD ):integer;
  109.     protected
  110.         hUnZip32:        THandle;
  111.         hLMZip32:        THandle;
  112.         hZip32J:            THandle;
  113.         FZip:                FARPROC;
  114.         FUnZip:            FARPROC;
  115.     public
  116.         procedure LoadDll; override;
  117.         procedure FreeDll; override;
  118. //        function ArchiverProc( _hwnd:HWND;_lpszCmdLine:PAnsiChar;_lpszOutput:PAnsiChar;_dwSize:DWORD ):integer; override;
  119.         function CheckArchive( lpszFileName:PAnsiChar;iMode:integer ):DWORD; override;
  120.         function CloseArchive( hArc:THARC ):integer; override;
  121.         function ExtractMem( Handle:HWND;lpszCmdLine:PAnsiChar;lpvBuffer:LPBYTE;dwSize:DWORD;lpTime:ptime_t;lpwAttr:LPWORD;lpdwWriteSize:LPDWORD ): integer; override;
  122.         function FindFirst( hArc:THArc;FileMask:string;IndivisualInfo:PIndivisualInfo ):integer; override;
  123.         function FindNext( hArc:THArc;IndivisualInfo:PIndivisualInfo ):integer; override;
  124.         function KillOwnerWindowEx( Handle:HWND ):BOOL; override;
  125.         function OpenArchive( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ): THARC; override;
  126.         function SetOwnerWindowEx( Handle:HWND;lpArcProc:LPARCHIVERPROC ):BOOL; override;
  127. //        function GetArchiveType( lpszFileName:PAnsiChar ):integer; virtual;
  128.     protected
  129.         function GetWriteTimeEx( hArc:THArc;var lpLastWriteTime:TFileTime ):BOOL; override;
  130.         function GetCreateTimeEx( hArc:THArc;var lpCreateTime:TFileTime ):BOOL; override;
  131.         function GetAccessTimeEx( hArc:THArc;var lpAccessTime:TFileTime ):BOOL; override;
  132.     end;
  133.  
  134. //---------------------------------------------------------------------
  135. var
  136.     FArchiver:    TZipDll;
  137.  
  138. procedure LoadDll;
  139. begin
  140.     if Assigned( FArchiver ) then exit;
  141.     FArchiver := TZipDll.Create;
  142.     FArchiver.LoadDLL;
  143. end;
  144.  
  145. procedure FreeDll;
  146. begin
  147.     FArchiver.Free;
  148.     FArchiver := nil;
  149. end;
  150.  
  151. //---------------------------------------------------------------------
  152. procedure TZipDll.LoadDll;
  153. begin
  154.     if hUnzip32 =  0 then hUnZip32 :=  Loadlibrary( UNZIP32DLL );
  155.     if hZip32J  =  0 then hZip32J  :=  Loadlibrary( ZIP32JDLL  );
  156.     if hLMZip32 =  0 then hLMZip32 :=  Loadlibrary( LMZIP32DLL );
  157.     if hUnZip32 <> 0 then exit;
  158.     if hZip32J  <> 0 then exit;
  159.     if hLMZip32 <> 0 then exit;
  160. end;
  161.  
  162. procedure TZipDll.FreeDll;
  163.     procedure Free( var hDLL:THandle );
  164.     begin
  165.         if hDLL = 0 then exit;
  166.         FreeLibrary( hDLL ) ;
  167.         hDLL := 0;
  168.     end;
  169. begin
  170.     Free( hUnZip32 );
  171.     Free( hLMZip32 );
  172.     Free( hZip32J  );
  173.     FZip                           := nil;
  174.     FUnZip                       := nil;
  175.     inherited;
  176. end;
  177.  
  178. function TZipDll.GetZipProc( var EntryPoint:FARPROC;hDLL1,hDLL2,hDLL3:HMODULE;ProcName:string;RaiseException:boolean ):boolean;
  179.     function ZipProc( hDLL:HMODULE;ProcName:string ):FARPROC;
  180.     begin
  181.         result := nil;
  182.         if hDLL = 0 then exit;
  183.         if hDLL = hLMZip32
  184.         then begin
  185.             if ( ProcName[3] = 'Z' ) then ProcName[3] := 'z';
  186.         end;
  187.         GetProcAddr( result,hDLL,PChar( ProcName ),false );
  188.     end;
  189. begin
  190.     result := true;
  191.  
  192.     EntryPoint := ZipProc( hDLL1,PChar( ProcName ));
  193.     if EntryPoint <> nil then exit;
  194.  
  195.     EntryPoint := ZipProc( hDLL2,PChar( ProcName ));
  196.     if EntryPoint <> nil then exit;
  197.  
  198.     EntryPoint := ZipProc( hDLL3,PChar( ProcName ));
  199.     if EntryPoint <> nil then exit;
  200.  
  201.     if RaiseException then raise EEntryNotFound.Create( Format( '%0:s é╠âGâôâgâè鬠DLL é╔î⌐é┬é⌐éΦé▄é╣é±é┼é╡é╜üB',[ProcName] ));
  202.     result := false;
  203. end;
  204.  
  205. function TZipDll.Zip( _hwnd:HWND;_lpszCmdLine:PAnsiChar;_lpszOutput:PAnsiChar;_dwSize:DWORD ):integer;
  206. begin
  207.     LoadDll;
  208.     GetZipProc( FZip,hZip32J,hLMZip32,0,'Zip',true );
  209.     if _dwSize = 0 then _lpszOutput := nil;
  210.     result := TArcDLLArchiverProc( FZip )( _hwnd,_lpszCmdLine,_lpszOutput,_dwSize );
  211. end;
  212.  
  213. function TZipDll.UnZip( _hwnd:HWND;_lpszCmdLine:PAnsiChar;_lpszOutput:PAnsiChar;_dwSize:DWORD ):integer;
  214. begin
  215.     LoadDll;
  216.     GetZipProc( FUnZip,hUnZip32,hLMZip32,0,'UnZip',true );
  217.     if _dwSize = 0 then _lpszOutput := nil;
  218.     result := TArcDLLArchiverProc( FUnZip )( _hwnd,_lpszCmdLine,_lpszOutput,_dwSize );
  219. end;
  220.  
  221. function TZipDll.OpenArchive( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ):THARC;
  222. begin
  223.     LoadDll;
  224.     GetZipProc( FOpenArchive,hLMZip32,hZip32J,hUnZip32,'UnZipOpenArchive',true );
  225.     result := inherited OpenArchive( Handle,PChar( ArchiveFileName ),dwMode );
  226. end;
  227.  
  228. function TZipDll.CloseArchive( hArc:THARC ):integer;
  229. begin
  230.     LoadDll;
  231.     GetZipProc( FCloseArchive,hLMZip32,hZip32J,hUnZip32,'UnZipCloseArchive',true );
  232.     result := inherited CloseArchive( hArc );
  233. end;
  234.  
  235. function TZipDll.FindFirst( hArc:THArc;FileMask:string;IndivisualInfo:PIndivisualInfo ):integer;
  236. begin
  237.     LoadDll;
  238.     GetZipProc( FFindFirst,hLMZip32,hZip32J,hUnZip32,'UnZipFindFirst',true );
  239.     result := inherited FindFirst( hArc,FileMask,IndivisualInfo );
  240. end;
  241.  
  242. function TZipDll.FindNext( hArc:THArc;IndivisualInfo:PIndivisualInfo ):integer;
  243. begin
  244. //    LoadDll;    Æxé¡é╚éΘé╠é┼éΓé▀é╜
  245.     GetZipProc( FFindNext,hLMZip32,hZip32J,hUnZip32,'UnZipFindNext',true );
  246.     result := inherited FindNext( hArc,IndivisualInfo );
  247. end;
  248.  
  249. function TZipDll.GetWriteTimeEx( hArc:THArc;var lpLastWriteTime:TFileTime ):BOOL;
  250. begin
  251.     GetZipProc( FGetWriteTimeEx,hLMZip32,hZip32J,hUnZip32,'UnzipGetWriteTimeEx',false );
  252.     result := inherited GetWriteTimeEx( hArc,lpLastWriteTime );
  253. end;
  254.  
  255. function TZipDll.GetCreateTimeEx( hArc:THArc;var lpCreateTime:TFileTime ):BOOL;
  256. begin
  257.     GetZipProc( FGetCreateTimeEx,hLMZip32,hZip32J,hUnZip32,'UnZipGetCreateTimeEx',false );
  258.     result := inherited GetCreateTimeEx( hArc,lpCreateTime );
  259. end;
  260.  
  261. function TZipDll.GetAccessTimeEx( hArc:THArc;var lpAccessTime:TFileTime ):BOOL;
  262. begin
  263.     GetZipProc( FGetAccessTimeEx,hLMZip32,hZip32J,hUnZip32,'UnZipGetAccessTimeEx',false );
  264.     result := inherited GetAccessTimeEx( hArc,lpAccessTime );
  265. end;
  266.  
  267. function TZipDll.CheckArchive( lpszFileName:PAnsiChar;iMode:integer ):DWORD;
  268. begin
  269.     LoadDll;
  270.     GetZipProc( FCheckArchive,hUnZip32,hLMZip32,hZip32J,'UnZipCheckArchive',true );
  271.     result := inherited CheckArchive( lpszFileName,iMode );
  272. end;
  273.  
  274. function TZipDll.SetOwnerWindowEx( Handle:HWND;lpArcProc:LPARCHIVERPROC ):BOOL;
  275. begin
  276.     GetProcAddr( FSetOwnerWindowEx,hUnZip32,'UnZipSetOwnerWindowEx',true );
  277.     result := inherited SetOwnerWindowEx( Handle,lpArcProc );
  278. end;
  279.  
  280. function TZipDll.KillOwnerWindowEx( Handle:HWND ):BOOL;
  281. begin
  282.     GetProcAddr( FKillOwnerWindowEx,hUnZip32,'UnZipKillOwnerWindowEx',true );
  283.     result := inherited KillOwnerWindowEx( Handle );
  284. end;
  285.  
  286. function TZipDll.ExtractMem( Handle:HWND;lpszCmdLine:PAnsiChar;lpvBuffer:LPBYTE;dwSize:DWORD;lpTime:ptime_t;lpwAttr:LPWORD;lpdwWriteSize:LPDWORD ):integer;
  287. begin
  288.     GetZipProc( FExtractMem,hUnZip32,hLMZip32,hZip32J,'UnZipExtractMem',true );
  289.     result := inherited ExtractMem( Handle,lpszCmdLine,lpvBuffer,dwSize,lpTime,lpwAttr,lpdwWriteSize );
  290. end;
  291.  
  292. //---------------------------------------------------------------------
  293. constructor TZip32.Create;
  294. begin
  295.     inherited Create;
  296. //    FSepChar := '/';
  297. end;
  298.  
  299. class procedure TZip32.LoadDll;
  300. begin
  301.     Zip32.LoadDll;
  302. end;
  303.  
  304. class procedure TZip32.FreeDll;
  305. begin
  306.     Zip32.FreeDll;
  307. end;
  308.  
  309. function TZip32.UnpackFiles( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;DstPath:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer;
  310. begin
  311.     if( FArchiver.hUnZip32 = 0 )and( FArchiver.hLMZip32 = 0 )
  312.     then raise EArchiver.Create( 'ZIP î`Ä«Åæî╔é╠ë≡ôÇé╔é═ UNZIP32.DLL é▄é╜é═ LMZIP32.DLL é¬òKùvé┼é╖üB' );
  313.     FCmdLine := BuildUnzipCmd( '-x',ArchiveFileName,Options,DstPath,FileList,UseResFile );
  314.     result := Unzip( Handle,FCmdLine,Output );
  315. end;
  316.  
  317. function TZip32.PackFiles( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer;
  318. begin
  319.     if FArchiver.hZip32J <> 0
  320.     then begin
  321.         FCmdLine := BuildZipCmd( '',ArchiveFileName,Options,BaseDir,FileList,UseResFile );
  322.         result := Zip( Handle,FCmdLine,Output );
  323.         exit;
  324.     end;
  325.     if FArchiver.hLMZip32 <> 0
  326.     then begin
  327.         FCmdLine := BuildLMZipCmd( '-ru',ArchiveFileName,Options,''{BaseDir},FileList,UseResFile );
  328.         DeleteFile( ArchiveFileName );        //    Æ╟ë┴é╡éµéñé╞é╖éΘé╞âAâvâèâPü[âVâçâôâGâëü[é¬ö¡É╢é╖éΘé╠é┼éáéτé⌐é╢é▀ìφÅ£é╖éΘ
  329.         result := Zip( Handle,FCmdLine,Output );
  330.         exit;
  331.     end;
  332.     raise EArchiver.Create( 'ZIP î`Ä«Åæî╔é╠ì∞ɼé╔é═ ZIP32J.DLL é▄é╜é═ LMZIP32.DLL é¬òKùvé┼é╖üB' );
  333. end;
  334.  
  335. function TZip32.RemoveItems( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer;
  336. begin
  337.     FCmdLine := BuildZipCmd( '-d',ArchiveFileName,Options,''{BaseDir},FileList,UseResFile );
  338.     result := Zip( Handle,FCmdLine,Output );
  339. end;
  340.  
  341. function TZip32.UpdateArchive( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer;
  342. begin
  343.     FCmdLine := BuildZipCmd( '-f',ArchiveFileName,Options,BaseDir,FileList,UseResFile );
  344.     result := Zip( Handle,FCmdLine,Output );
  345. end;
  346.  
  347. function TZip32.MakeSfx( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;DstPath:String;var Output:string ):Integer;
  348. var
  349.     SfxDat:    array[0..511] of char;
  350.     SfxName:    string;
  351.     SfxHead:    TFileStream;
  352.     SfxFile:    TFileStream;
  353.     ArcFile:    TFileStream;
  354.     P:            PAnsiChar;
  355. begin
  356.     if FArchiver.hZip32J=0 then raise EArchiver.Create( 'ZIP î`Ä«Åæî╔é⌐éτé╠Ä⌐î╚ë≡ôÇÅæî╔ì∞ɼé╔é═ ZIP32J.DLL é¬òKùvé┼é╖üB' );
  357.  
  358.     if Options.gw > 0
  359.     then begin
  360.         if SearchPath( nil,'sfx32gui.dat',nil,SizeOf( SfxDat ),SfxDat,P ) = 0
  361.         then raise EArchiver.Create( 'zip Åæî╔é⌐éτé╠Win32Ä⌐î╚ë≡ôÇÅæî╔é╠ì∞ɼé╔é═ sfx32gui.dat é¬òKùvé┼é╖üB' );
  362.     end else begin
  363.         if SearchPath( nil,'sfx16.dat',nil,SizeOf( SfxDat ),SfxDat,P ) = 0
  364.         then raise EArchiver.Create( 'zip Åæî╔é⌐éτé╠DOSÄ⌐î╚ë≡ôÇÅæî╔é╠ì∞ɼé╔é═ sfx16.dat é¬òKùvé┼é╖üB' );
  365.     end;
  366.  
  367.     SfxName := ChangeFileExt( ArchiveFileName,'.EXE' );
  368.     if DstPath <> ''
  369.     then begin
  370.         SfxName := ExtractFileName( SfxName );
  371.         SfxName := MakeFileName( DstPath,SfxName );
  372.     end;
  373.     ArcFile := TFileStream.Create( ArchiveFileName,fmOpenRead+fmShareDenyWrite );
  374.     SfxFile := TFileStream.Create( SfxName        ,fmCreate                    );
  375.     SfxHead := TFileStream.Create( SfxDat         ,fmOpenRead+fmShareDenyWrite );
  376.     try
  377.         SfxFile.CopyFrom( SfxHead,0 );
  378.         SfxFile.CopyFrom( ArcFile,0 );
  379.     finally
  380.         ArcFile.Free;
  381.         SfxFile.Free;
  382.         SfxHead.Free;
  383.     end;
  384.  
  385.     FCmdLine := '-A '+SfxName;
  386.     result := Zip( Handle,FCmdLine,Output );
  387. end;
  388.  
  389. function TZip32.UnpackToMem( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD ):Integer;
  390. var
  391.     FileList:    TStringList;
  392. begin
  393.     FileList := TStringList.Create;
  394.     try
  395.         FileList.Add( FileName );
  396.         FCmdLine := BuildUnzipCmd( '',ArchiveFileName,Options,'',[FileList],false );
  397.         result := FArchiver.ExtractMem( Handle,PChar( FCmdLine ),lpvBuffer,dwSize,nil,nil,lpdwWriteSize );
  398.     finally
  399.         FileList.Free;
  400.     end;
  401. end;
  402.  
  403. function TZip32.CheckArchive( ArchiveFileName:string;CheckMode:integer;CheckOptions:integer ):DWORD;
  404. begin
  405.     result := FArchiver.CheckArchive( PChar( ArchiveFileName ),CheckMode );
  406. end;
  407.  
  408. function TZip32.Unzip( Handle:HWND;CmdLine:string;var Output:string ):Integer;
  409. begin
  410.     result := FArchiver.UnZip( Handle,PAnsiChar( CmdLine ),PAnsiChar( Output ),Length( Output ));
  411. end;
  412.  
  413. function TZip32.Zip( Handle:HWND;CmdLine:string;var Output:string ):Integer;
  414. begin
  415.     result := FArchiver.Zip( Handle,PAnsiChar( CmdLine ),PAnsiChar( Output ),Length( Output ));
  416. end;
  417.  
  418. function TZip32.SetOwnerWindowEx( Handle:HWND;lpArcProc:LPARCHIVERPROC ):boolean;
  419. begin
  420.     result := FArchiver.SetOwnerWindowEx( Handle,lpArcProc );
  421.     inherited SetOwnerWindowEx( Handle,lpArcProc );
  422. end;
  423.  
  424. function TZip32.KillOwnerWindowEx( Handle:HWND ):boolean;
  425. begin
  426.     result := FArchiver.KillOwnerWindowEx( Handle );
  427.     inherited KillOwnerWindowEx( Handle );
  428. end;
  429.  
  430. function Zip32JFilter( FileName:string ):string;
  431. var
  432.     TmpStr:    string;
  433.     Pos0:        Integer;
  434.     Pos1:        Integer;
  435.     Pos2:        Integer;
  436. //    Pos3:        Integer;
  437.     procedure Replace( Pos,Size:integer;NewString:string );
  438.     begin
  439.         Result := Result + Copy( TmpStr,1,Pos-1 ) + NewString;
  440.         TmpStr := Copy( TmpStr,Pos+Size,MaxInt );
  441.     end;
  442. begin
  443.     TmpStr := FileName;
  444.     Result := '';
  445.     while TmpStr <> '' do begin
  446.         Pos1 := AnsiPos( '\',TmpStr );
  447.         Pos2 := AnsiPos( '[',TmpStr );
  448. //        Pos3 := AnsiPos( ']',TmpStr );
  449.  
  450.         Pos0 := MaxInt;
  451.         if( Pos1 > 0 )and( Pos1 < Pos0 ) then Pos0 := Pos1;
  452.         if( Pos2 > 0 )and( Pos2 < Pos0 ) then Pos0 := Pos2;
  453. //        if( Pos3 > 0 )and( Pos3 < Pos0 ) then Pos0 := Pos3;
  454.         if Pos0 = MaxInt then Break;
  455.  
  456.         if Pos1 = Pos0 then Replace( Pos1,1,'/'   );
  457.         if Pos2 = Pos0 then Replace( Pos2,1,'[[]' );
  458. //        if Pos3 = Pos0 then Replace( Pos3,1,'[]]' );
  459.     end;
  460.     Result := Result + TmpStr;
  461. end;
  462.  
  463. function TZip32.BuildUnzipCmd( Cmd,ArchiveFileName:string;Options:TArchiverOptions;Path:String;FileList:array of const;UseResFile:boolean ):String;
  464. var
  465.     CmdLine:    TCmdOpt;
  466. begin
  467.     with Options do begin
  468.         CmdLine := TCmdOpt.Create;
  469.         try
  470.             CmdLine.Filter := Zip32JFilter;
  471.  
  472. //            CmdLine.Add( '-+' );            //    Åφé╔âîâWâXâgâèé╠É▌ÆΦé≡û│Äïé╖éΘ
  473.  
  474. //            CmdLine.AddIntOpt( 'a'  ,a   );        //    a[0|1|2]                æ«É½é╠ì─î╗üB
  475.             if c=1 then CmdLine.Add( '-o' );        //    c[0|1]                â^âCâÇâXâ^âôâvîƒì╕é≡Å╚ù¬
  476. //            CmdLine.AddIntOpt( 'd'  ,d   );        //    d[0|1]                âfâBâîâNâgâèû╝é╠èiö[
  477. //            CmdLine.AddIntOpt( 'e'  ,e   );        //    e[0|1]                Ä½ÅæâTâCâYé≡ö╝ò¬é╔é╡é─ê│Åk
  478. //            CmdLine.AddIntOpt( 'f'  ,f   );        //    f[0|1]                âfâBâXâNÄcù╩â`âFâbâNé╠ÆåÄ~
  479. //            CmdLine.AddIntOpt( 'h'  ,h   );        //    h[0|1|2|3]            âwâbâ_é╠î`Ä«é≡ÄwÆΦ
  480. //            CmdLine.AddIntOpt( 'i'  ,i   );        //    i[0|1|2]                âtâ@âCâïæIæ≡é┼æσò╢ÄÜé╞żò╢ÄÜé≡ïµò╩
  481. //            CmdLine.AddIntOpt( 'l'  ,l   );        //    l[0|1|2]                ôWèJâìâOé╠âtâ@âCâïû╝é╠ò\Īû@é╠ò╧ìX
  482. //            CmdLine.AddIntOpt( 'm'  ,m   );        //    m[0|1|2]                Ä┐ûΓé╔ yes é╞ë╝ÆΦ
  483.             if( n > 0 )or( CallbackEnabled )
  484.             then CmdLine.Add( '--i' );                //    n[0|1]                ôWèJÅ≤ï╡â_âCâAâìâOò\Īé╠ù}Ä~
  485. //            CmdLine.AddIntOpt( 'o'  ,o   );        //    o[0|1|2]                ïîî`Ä«é┼Åæî╔é≡ì∞ɼ
  486. //            CmdLine.AddIntOpt( 'p'  ,p   );        //    p[0|1|2]                æSâpâXû╝é┼ìçÆv
  487. //            CmdLine.AddIntOpt( 'r'  ,r   );        //    r[0|1|2]                ì─ïAôIîƒì⌡
  488. //            CmdLine.AddIntOpt( 's'  ,s   );        //    s[0|1]                âXâLâbâvò\Īé╠ù}ɺ
  489. //            CmdLine.AddIntOpt( 't'  ,t   );        //    t[0|1]                Åæî╔é╠ìXÉVô·Ä₧é╠ÄwÆΦ
  490.  
  491. //            CmdLine.AddIntOpt( 'u'  ,u   );        //    u[0|1]                âtâ@âCâïé╠ìXÉVüiÉVé╡éóéαé╠üj
  492. //            CmdLine.AddPath1 ( 'w'  ,w   );        //    w[0|1|<Dirû╝>]        ì∞ï╞ùpâfâBâîâNâgâèé╠ÄwÆΦ
  493.             if x=0 then CmdLine.Add( '-j' );        //    x[0|1]                âfâBâîâNâgâèû╝é≡ùLî°é╔é╖éΘ
  494. //            CmdLine.AddIntOpt( 'y'  ,y   );        //    y[0|1]                æSé─é╠Ä┐ûΓé╔ yes é╞ë╝ÆΦ
  495. //            CmdLine.AddIntOpt( 'z'  ,z   );        //    z[0|1|2|<ègÆúÄq>]    ûóê│Åkâtâ@âCâïé╠ÄwÆΦ            ###ègÆúÄqé═âTâ|ü[âgé╡é╚éó###
  496. //            CmdLine.AddIntOpt( 'jc' ,jc  );        //    jc[0|1]                öjæ╣âwâbâ_é≡û│Äï
  497. //            CmdLine.AddIntOpt( 'jd' ,jd  );        //    jd[<âTâCâY>]        âfâBâXâNé╠ï≤é½ùeù╩é≡èmöF
  498. //            CmdLine.AddIntOpt( 'je' ,je  );        //    je[<âTâCâY>]        Huffman âoâbâtâ@é╠æσé½é│é≡ÄwÆΦ
  499. //            CmdLine.AddIntOpt( 'jf' ,jf  );        //    jf[0|1]                âïü[âgïLìåé╠ìφÅ£
  500. //            CmdLine.AddIntOpt( 'jh' ,jh  );        //    jh[0|1]                WindowsNT/95 ÉΩùpé╠â}ü[âNé≡Åæî╔é╔òtë┴
  501. //            CmdLine.AddIntOpt( 'ji' ,ji  );        //    ji[0|1]                ÆZéóâtâ@âCâïû╝é┼èiö[
  502. //            CmdLine.AddIntOpt( 'jm' ,jm  );        //    jm[0|1|2|3|4]        ê│Åkî`Ä«é≡ÄwÆΦ
  503. //            CmdLine.AddIntOpt( 'jn' ,jn  );        //    jn[0|1]                ÉVïKâtâ@âCâïé╠é▌
  504. //            CmdLine.AddStrOpt( 'jo' ,jo  );        //    jo[<Ä₧ìÅÄwÆΦ>]        YYMMDDHHMMSS é╠ô·òtê╚ì~
  505. //            CmdLine.AddStrOpt( 'job',job );        //    job[<Ä₧ìÅÄwÆΦ>]    YYMMDDHHMMSS é╠ô·òtê╚æO
  506. //            CmdLine.AddIntOpt( 'jp' ,jp  );        //    jp[0|1]                ÉiÆ╗âoü[é≡âvâìâOâîâXüEâoü[é┼ò\Ī
  507. //            CmdLine.AddIntOpt( 'jr' ,jr  );        //    jr[0|1]                âtâ@âCâïé╠Æué½è╖éª
  508. //            CmdLine.AddIntOpt( 'jss',jss );        //    jss[0|1]                ê│Åkâtâ@âCâïâIü[âvâôâGâëü[é≡û│ÄïüBÆ╩ÅφüCê│ÅkÄ₧é╔ê│Åkæ╬Å█âtâ@
  509. //            CmdLine.AddIntOpt( 'jw' ,jw  );        //    jw[0|1|2|3|4]        WinSFX/WinSFXM é≡ì∞ɼ
  510. //            CmdLine.AddLstOpt( 'jx' ,jx  );        //    jx[<âtâ@âCâïû╝>]    Å£èOé╖éΘâtâ@âCâïû╝
  511. //            CmdLine.AddIntOpt( 'jyc',jyc );        //    jyc[0|1]                âfâBâîâNâgâèì∞ɼé╠èmöFé≡Å╚ù¬
  512. //            CmdLine.AddIntOpt( 'jyd',jyd );        //    jyd[0|1]                âtâ@âCâïìφÅ£é╠èmöFé≡Å╚ù¬
  513. //            CmdLine.AddIntOpt( 'jyk',jyk );        //    jyk[0|1]                Ägùpé┼é½éΘâfâBâXâNùeù╩é╠èmöFé╠Å╚ù¬
  514. //            CmdLine.AddIntOpt( 'jyn',jyn );        //    jyn[0|1]                ÉVâtâ@âCâïû╝é╠ùvïüé╠Å╚ù¬
  515. //            CmdLine.AddIntOpt( 'jyo',jyo );        //    jyo[0|1]                è∙æ╢âtâ@âCâïé╓é╠ÅπÅæé½èmöFé╠Å╚ù¬
  516. //            CmdLine.AddStrOpt( 'jz' ,jz  );        //    jz[<âtâ@âCâïû╝>]    âtâ@âCâïÆìÄ▀é╠âtâ@âCâïé≡ïƒïï
  517. //            CmdLine.AddIntOpt( 'ga' ,ga  );        //    ga[0|1]                Åæé½ì₧é▌òsë┬æ«É½é≡û│Äï
  518. //            CmdLine.AddIntOpt( 'gd' ,gd  );        //    gd[0|1]                ù]ò¬é╚âfü[â^é╠ìφÅ£
  519. //            CmdLine.AddIntOpt( 'ge' ,ge  );        //    ge[0|1]                ì┼Åëé╠ègÆúÄqé≡öFÄ»
  520. //            CmdLine.AddIntOpt( 'gf' ,gf  );        //    gf[0|1|2]            é╖é┼é╔éáéΘâtâ@âCâïé╠ìXÉV
  521. //            CmdLine.AddIntOpt( 'gj' ,gj  );        //    gj[0|1]                x û╜ù▀é≡ e û╜ù▀é╞ô»ùlé╞î⌐é╚é╖
  522. //            CmdLine.AddIntOpt( 'gm' ,gm  );        //    gm[0|1]                âGâëü[âüâbâZü[âWò\Īé╠ù}Ä~
  523. //            CmdLine.AddIntOpt( 'gn' ,gn  );        //    gn[0|1|2]            ôWèJâtâ@âCâïé╠ìçîvâTâCâYé≡ 100% é╞é╡é╜ÉiÆ╗âOâëâté╠ò\Ī
  524. //            CmdLine.AddIntOpt( 'go' ,go  );        //    go[0|1]                â_âCâAâìâOé╠âIü[âiü[âEâBâôâhâEé╠ÄwÆΦ
  525. //            CmdLine.AddIntOpt( 'gp' ,gp  );        //    gp[0|1]                âEâBâôâhâEé≡ Disable é╔é╡é╚éó
  526. //            CmdLine.AddIntOpt( 'gr' ,gr  );        //    gr[<âtâ@âCâïû╝>]    ò╧ìXâtâ@âCâïû╝é≡ïƒïï
  527. //            CmdLine.AddIntOpt( 'gs' ,gs  );        //    gs[<âTâCâY>]        âwâbâ_îƒì⌡âTâCâYé╠ÄwÆΦ
  528. //            CmdLine.AddIntOpt( 'gu' ,gu  );        //    gu[0|1]                WinSFXüCDosSFX é╔æSé─é╠âtâ@âCâïé≡èiö[
  529. //            CmdLine.AddIntOpt( 'gw' ,gw  );        //    gw[0|1|2|3|4]        WinSFX32/WinSFX32M é≡ì∞ɼ
  530.  
  531.             CmdLine.Add( UserOptions );
  532.  
  533.             AddFileSpec1( CmdLine,ArchiveFileName,Path );
  534.             AddFileSpec2( CmdLine,Options,FileList,UseResFile );
  535.  
  536.             result := cmd + CmdLine.Str;
  537.         finally
  538.             CmdLine.Free;
  539.         end;
  540.     end;
  541. end;
  542.  
  543. function TZip32.BuildLMZipCmd( Cmd,ArchiveFileName:string;Options:TArchiverOptions;Path:String;FileList:array of const;UseResFile:boolean ):String;
  544. var
  545.     CmdLine:    TCmdOpt;
  546. begin
  547.     with Options do begin
  548.         CmdLine := TCmdOpt.Create;
  549.         try
  550. //            CmdLine.Add( '-+' );            //    Åφé╔âîâWâXâgâèé╠É▌ÆΦé≡û│Äïé╖éΘ
  551.  
  552. //            CmdLine.AddIntOpt( 'a'  ,a   );        //    a[0|1|2]                æ«É½é╠ì─î╗üB
  553.             if c=1 then CmdLine.Add( '-o' );        //    c[0|1]                â^âCâÇâXâ^âôâvîƒì╕é≡Å╚ù¬
  554. //            CmdLine.AddIntOpt( 'd'  ,d   );        //    d[0|1]                âfâBâîâNâgâèû╝é╠èiö[
  555. //            CmdLine.AddIntOpt( 'e'  ,e   );        //    e[0|1]                Ä½ÅæâTâCâYé≡ö╝ò¬é╔é╡é─ê│Åk
  556. //            CmdLine.AddIntOpt( 'f'  ,f   );        //    f[0|1]                âfâBâXâNÄcù╩â`âFâbâNé╠ÆåÄ~
  557. //            CmdLine.AddIntOpt( 'h'  ,h   );        //    h[0|1|2|3]            âwâbâ_é╠î`Ä«é≡ÄwÆΦ
  558. //            CmdLine.AddIntOpt( 'i'  ,i   );        //    i[0|1|2]                âtâ@âCâïæIæ≡é┼æσò╢ÄÜé╞żò╢ÄÜé≡ïµò╩
  559. //            CmdLine.AddIntOpt( 'l'  ,l   );        //    l[0|1|2]                ôWèJâìâOé╠âtâ@âCâïû╝é╠ò\Īû@é╠ò╧ìX
  560. //            CmdLine.AddIntOpt( 'm'  ,m   );        //    m[0|1|2]                Ä┐ûΓé╔ yes é╞ë╝ÆΦ
  561. //            if n=1 then CmdLine.Add( '--i' );    //    n[0|1]                ôWèJÅ≤ï╡â_âCâAâìâOò\Īé╠ù}Ä~
  562. //            CmdLine.AddIntOpt( 'o'  ,o   );        //    o[0|1|2]                ïîî`Ä«é┼Åæî╔é≡ì∞ɼ
  563. //            CmdLine.AddIntOpt( 'p'  ,p   );        //    p[0|1|2]                æSâpâXû╝é┼ìçÆv
  564. //            CmdLine.AddIntOpt( 'r'  ,r   );        //    r[0|1|2]                ì─ïAôIîƒì⌡
  565. //            CmdLine.AddIntOpt( 's'  ,s   );        //    s[0|1]                âXâLâbâvò\Īé╠ù}ɺ
  566. //            CmdLine.AddIntOpt( 't'  ,t   );        //    t[0|1]                Åæî╔é╠ìXÉVô·Ä₧é╠ÄwÆΦ
  567.  
  568. //            CmdLine.AddIntOpt( 'u'  ,u   );        //    u[0|1]                âtâ@âCâïé╠ìXÉVüiÉVé╡éóéαé╠üj
  569. //            CmdLine.AddIntOpt( 'w'  ,w   );        //    w[0|1|<Dirû╝>]        ì∞ï╞ùpâfâBâîâNâgâèé╠ÄwÆΦ
  570.             if x=0 then CmdLine.Add( '-j' );        //    x[0|1]                âfâBâîâNâgâèû╝é≡ùLî°é╔é╖éΘ
  571. //            CmdLine.AddIntOpt( 'y'  ,y   );        //    y[0|1]                æSé─é╠Ä┐ûΓé╔ yes é╞ë╝ÆΦ
  572. //            CmdLine.AddIntOpt( 'z'  ,z   );        //    z[0|1|2|<ègÆúÄq>]    ûóê│Åkâtâ@âCâïé╠ÄwÆΦ            ###ègÆúÄqé═âTâ|ü[âgé╡é╚éó###
  573. //            CmdLine.AddIntOpt( 'jc' ,jc  );        //    jc[0|1]                öjæ╣âwâbâ_é≡û│Äï
  574. //            CmdLine.AddIntOpt( 'jd' ,jd  );        //    jd[<âTâCâY>]        âfâBâXâNé╠ï≤é½ùeù╩é≡èmöF
  575. //            CmdLine.AddIntOpt( 'je' ,je  );        //    je[<âTâCâY>]        Huffman âoâbâtâ@é╠æσé½é│é≡ÄwÆΦ
  576. //            CmdLine.AddIntOpt( 'jf' ,jf  );        //    jf[0|1]                âïü[âgïLìåé╠ìφÅ£
  577. //            CmdLine.AddIntOpt( 'jh' ,jh  );        //    jh[0|1]                WindowsNT/95 ÉΩùpé╠â}ü[âNé≡Åæî╔é╔òtë┴
  578. //            CmdLine.AddIntOpt( 'ji' ,ji  );        //    ji[0|1]                ÆZéóâtâ@âCâïû╝é┼èiö[
  579. //            CmdLine.AddIntOpt( 'jm' ,jm  );        //    jm[0|1|2|3|4]        ê│Åkî`Ä«é≡ÄwÆΦ
  580. //            CmdLine.AddIntOpt( 'jn' ,jn  );        //    jn[0|1]                ÉVïKâtâ@âCâïé╠é▌
  581. //            CmdLine.AddStrOpt( 'jo' ,jo  );        //    jo[<Ä₧ìÅÄwÆΦ>]        YYMMDDHHMMSS é╠ô·òtê╚ì~
  582. //            CmdLine.AddStrOpt( 'job',job );        //    job[<Ä₧ìÅÄwÆΦ>]    YYMMDDHHMMSS é╠ô·òtê╚æO
  583. //            CmdLine.AddIntOpt( 'jp' ,jp  );        //    jp[0|1]                ÉiÆ╗âoü[é≡âvâìâOâîâXüEâoü[é┼ò\Ī
  584. //            CmdLine.AddIntOpt( 'jr' ,jr  );        //    jr[0|1]                âtâ@âCâïé╠Æué½è╖éª
  585. //            CmdLine.AddIntOpt( 'jss',jss );        //    jss[0|1]                ê│Åkâtâ@âCâïâIü[âvâôâGâëü[é≡û│ÄïüBÆ╩ÅφüCê│ÅkÄ₧é╔ê│Åkæ╬Å█âtâ@
  586. //            CmdLine.AddIntOpt( 'jw' ,jw  );        //    jw[0|1|2|3|4]        WinSFX/WinSFXM é≡ì∞ɼ
  587. //            CmdLine.AddLstOpt( 'jx' ,jx  );        //    jx[<âtâ@âCâïû╝>]    Å£èOé╖éΘâtâ@âCâïû╝
  588. //            CmdLine.AddIntOpt( 'jyc',jyc );        //    jyc[0|1]                âfâBâîâNâgâèì∞ɼé╠èmöFé≡Å╚ù¬
  589. //            CmdLine.AddIntOpt( 'jyd',jyd );        //    jyd[0|1]                âtâ@âCâïìφÅ£é╠èmöFé≡Å╚ù¬
  590. //            CmdLine.AddIntOpt( 'jyk',jyk );        //    jyk[0|1]                Ägùpé┼é½éΘâfâBâXâNùeù╩é╠èmöFé╠Å╚ù¬
  591. //            CmdLine.AddIntOpt( 'jyn',jyn );        //    jyn[0|1]                ÉVâtâ@âCâïû╝é╠ùvïüé╠Å╚ù¬
  592. //            CmdLine.AddIntOpt( 'jyo',jyo );        //    jyo[0|1]                è∙æ╢âtâ@âCâïé╓é╠ÅπÅæé½èmöFé╠Å╚ù¬
  593. //            CmdLine.AddStrOpt( 'jz' ,jz  );        //    jz[<âtâ@âCâïû╝>]    âtâ@âCâïÆìÄ▀é╠âtâ@âCâïé≡ïƒïï
  594. //            CmdLine.AddIntOpt( 'ga' ,ga  );        //    ga[0|1]                Åæé½ì₧é▌òsë┬æ«É½é≡û│Äï
  595. //            CmdLine.AddIntOpt( 'gd' ,gd  );        //    gd[0|1]                ù]ò¬é╚âfü[â^é╠ìφÅ£
  596. //            CmdLine.AddIntOpt( 'ge' ,ge  );        //    ge[0|1]                ì┼Åëé╠ègÆúÄqé≡öFÄ»
  597. //            CmdLine.AddIntOpt( 'gf' ,gf  );        //    gf[0|1|2]            é╖é┼é╔éáéΘâtâ@âCâïé╠ìXÉV
  598. //            CmdLine.AddIntOpt( 'gj' ,gj  );        //    gj[0|1]                x û╜ù▀é≡ e û╜ù▀é╞ô»ùlé╞î⌐é╚é╖
  599. //            CmdLine.AddIntOpt( 'gm' ,gm  );        //    gm[0|1]                âGâëü[âüâbâZü[âWò\Īé╠ù}Ä~
  600. //            CmdLine.AddIntOpt( 'gn' ,gn  );        //    gn[0|1|2]            ôWèJâtâ@âCâïé╠ìçîvâTâCâYé≡ 100% é╞é╡é╜ÉiÆ╗âOâëâté╠ò\Ī
  601. //            CmdLine.AddIntOpt( 'go' ,go  );        //    go[0|1]                â_âCâAâìâOé╠âIü[âiü[âEâBâôâhâEé╠ÄwÆΦ
  602. //            CmdLine.AddIntOpt( 'gp' ,gp  );        //    gp[0|1]                âEâBâôâhâEé≡ Disable é╔é╡é╚éó
  603. //            CmdLine.AddIntOpt( 'gr' ,gr  );        //    gr[<âtâ@âCâïû╝>]    ò╧ìXâtâ@âCâïû╝é≡ïƒïï
  604. //            CmdLine.AddIntOpt( 'gs' ,gs  );        //    gs[<âTâCâY>]        âwâbâ_îƒì⌡âTâCâYé╠ÄwÆΦ
  605. //            CmdLine.AddIntOpt( 'gu' ,gu  );        //    gu[0|1]                WinSFXüCDosSFX é╔æSé─é╠âtâ@âCâïé≡èiö[
  606. //            CmdLine.AddIntOpt( 'gw' ,gw  );        //    gw[0|1|2|3|4]        WinSFX32/WinSFX32M é≡ì∞ɼ
  607.  
  608.             CmdLine.Add( UserOptions );
  609.  
  610.             AddFileSpec1( CmdLine,ArchiveFileName,Path );
  611.             AddFileSpec2( CmdLine,Options,FileList,UseResFile );
  612.  
  613.             result := cmd + CmdLine.Str;
  614.         finally
  615.             CmdLine.Free;
  616.         end;
  617.     end;
  618. end;
  619.  
  620. function TZip32.BuildZipCmd( Cmd,ArchiveFileName:string;Options:TArchiverOptions;Path:String;FileList:array of const;UseResFile:boolean ):String;
  621. var
  622.     CmdLine:    TCmdOpt;
  623.     function zdate( yymmddhhmmss:string ):string;
  624.     var
  625.         yy:    string;
  626.         yyyy:    string;
  627.     begin
  628.         if yymmddhhmmss = aosUnAssigned
  629.         then begin
  630.             result := aosUnAssigned;
  631.             exit;
  632.         end;
  633.  
  634.         yy := copy( yymmddhhmmss,1,2 );    //    yy
  635.         if StrToInt( yy ) < 80
  636.         then yyyy := '20'+yy
  637.         else yyyy := '19'+yy;
  638.  
  639.         result := copy( yymmddhhmmss,3,4 )+yyyy;    //    mmdd+yyyy
  640.     end;
  641. //    procedure AddDateOpt( opt,yymmddhhmmss:string );
  642. //    var
  643. //        zd:    string;
  644. //    begin
  645. //        zd := zdate( yymmddhhmmss );
  646. //        if zd <> aosUnAssigned then CmdLine.Add( '-'+opt+' '+zd );
  647. //    end;
  648. begin
  649. {
  650. -    -d    Remove(delete) entries from a zip archive.
  651.         Åæî╔ôαâtâ@âCâïé╠ìφÅ£
  652. -    -f    Freshen(replace) an existing entry in the zip archive
  653.         only if it has been modified more recently than the version
  654.         already in the zip archive.
  655.             ex) zip -f foo
  656.         Åæî╔ôαé╠âtâ@âCâïé╠ìXÉVé≡ìséñ
  657. -    -F    Fix
  658.         Åæî╔é╠ÅCò£
  659. -    -h    Help
  660. -------------------------------
  661. x    -A    Adjust self-extractiong executable archive.
  662.         Åæî╔é≡Ä⌐î╚ë≡ôÇÄ└ìsî`Ä«é╞ë╝ÆΦüB(?)
  663. o    -D    Do not create entries in the zip archive for directories.
  664.         âfâBâîâNâgâèû╝é≡èiö[é╡é╚éóüB
  665. x    -e    Encrypt the contents of the zip archive using a password.
  666.         ê├ìåë╗é≡ìséñüB(ûóâTâ|ü[âg)
  667. o    -FF    Åæî╔é╠ÅCò£(Åæî╔âTâCâYé≡ÉMùpé╡é╚éó)
  668. x    -g    Grow(append t) the specified zip archive.
  669. o    -j    Junk the path.
  670.         âpâXû╝é≡ò█æ╢é╡é╚éóé┼âtâ@âCâïû╝é╛é»ò█æ╢
  671. o    -J    strip any prepended data(e.g. a SFX stub) from the archive.
  672.         Ä⌐î╚ë≡ôÇî`Ä«é╠Åæî╔é≡òüÆ╩é╠Åæî╔é╔é╖éΘüB
  673. o    -k    attempt to convert the names and paths to conform to MSDOS.
  674.         âtâ@âCâïû╝é≡MSDOSî`Ä«é╔ò╧è╖é╖éΘüB
  675. x    -l    LF->CR LFò╧è╖(Unix->MSDOS)
  676. x    -ll    CR LF->LFò╧è╖(MSDOS->Unix)
  677. x    -m    Move the specified files into the zip archive;
  678. o    -o    set Oldest time
  679.         Åæî╔ôαé╠âtâ@âCâïé╠ì┼ÅIìXÉVÄ₧ìÅé≡êΩö╘ÉVé╡éóâtâ@âCâïé╠ô·Ä₧é╔ò╧ìX
  680.         (ê°Éöé═âtâ@âCâïé╠é▌)
  681. o    -q    Quit mode.
  682.         âüâbâZü[âWé≡ò\Īé╡é╚éóüB
  683. o    -r    travel the directory structure Recursively
  684.             ex) zip -r foo foo
  685.         ÄwÆΦé╡é╜âfâBâîâNâgâè/âtâ@âCâïé≡ì─ïAôIé╔ò█æ╢é╖éΘüB
  686. x    -R    travel the directory structure Recursively starting at the
  687.         current directory.
  688.             ex) zip -R foo *.c
  689.         âJâîâôâgâfâBâîâNâgâèê╚ë║é╠ì\æóé┼é≡ì─ïAôIé╔îƒì⌡é╡ò█æ╢é╖éΘüB
  690.         (*.cé╔â}âbâ`é╖éΘéαé╠é╠é▌ò█æ╢é╖éΘ)
  691. o    -S    include System and hidden files.
  692.         âVâXâeâÇæ«É½/ëBé╡æ«É½é╠âtâ@âCâïéαè▄é▀éΘüB
  693. o    -t mmddyyyy    do not operate on files modified prior to the specified
  694.         data.
  695.             ex) zip -rt 12071997 infamy foo
  696.         ÄwÆΦô·Ä₧ê╚ì~é╔ÅCÉ│é│éΩé╜âtâ@âCâïé╠é▌æÇì∞é≡ìséñüB
  697. o    -tt mmddyyyy
  698.         ÄwÆΦô·Ä₧éµéΦæOé╔ÅCÉ│é│éΩé╜âtâ@âCâïé╠é▌æÇì∞é≡ìséñ
  699. o    -u    Updata(replace) an existing entry in the zip archive only if
  700.         it has been modified more recetntly than the version already
  701.         in the zip archive.
  702.         Åæî╔ôαé╠âtâ@âCâïé╞ì┼ÅIìXÉVô·Ä₧é╠öΣèré≡ìséóÉVé╡éóéαé╠é╠é▌
  703.         Æué½è╖éªéΘüB
  704. o    -v    Verbose mode or print diagnostic versio info.
  705.         âüâbâZü[âWé≡Å┌ì╫ò\Ī
  706. x    -X    do not save extra file attributes(Extended Attributes on OS/2
  707.         ,uid/gid and file times on Unix)
  708.         Unix,OS/2ôÖé┼ùpéóéΘ(ègÆú)æ«É½é═ò█æ╢é╡é╚éóüB
  709. x    -$    include the Volume label.
  710.         â{âèâàü[âÇâëâxâïéαò█æ╢
  711. o    -#(0-9 number)    Regulate the speed of compression.
  712.         ê│ÅkùªüAâXâsü[âhé╠É▌ÆΦüB
  713.         (-0:ê│Åké╡é╚éó/-1:êΩö╘æ¼éó(ê│Åkùªì┼ż)/-9:êΩö╘Æxéó(ê│Åkùªì┼æσ))
  714.         âfâtâHâïâgé═-6
  715. }
  716.     with Options do begin
  717.         CmdLine := TCmdOpt.Create;
  718.         try
  719. //            CmdLine.Add( '-+' );            //    Åφé╔âîâWâXâgâèé╠É▌ÆΦé≡û│Äïé╖éΘ
  720.             CmdLine.Filter := Zip32JFilter;
  721.  
  722.             if a > 0 then CmdLine.Add( '-S' );        //    a[0|1|2]                æ«É½é╠ì─î╗üB
  723.             if a < 2 then CmdLine.Add( '-D' );        //    a[0|1|2]                æ«É½é╠ì─î╗üB
  724. //            CmdLine.AddIntOpt( 'c'  ,c   );            //    c[0|1]                â^âCâÇâXâ^âôâvîƒì╕é≡Å╚ù¬
  725. //            CmdLine.AddIntOpt( 'd'  ,d   );            //    d[0|1]                âfâBâîâNâgâèû╝é╠èiö[
  726. //            CmdLine.AddIntOpt( 'e'  ,e   );            //    e[0|1]                Ä½ÅæâTâCâYé≡ö╝ò¬é╔é╡é─ê│Åk
  727. //            CmdLine.AddIntOpt( 'f'  ,f   );            //    f[0|1]                âfâBâXâNÄcù╩â`âFâbâNé╠ÆåÄ~
  728. //            CmdLine.AddIntOpt( 'h'  ,h   );            //    h[0|1|2|3]            âwâbâ_é╠î`Ä«é≡ÄwÆΦ
  729. //            CmdLine.AddIntOpt( 'i'  ,i   );            //    i[0|1|2]                âtâ@âCâïæIæ≡é┼æσò╢ÄÜé╞żò╢ÄÜé≡ïµò╩
  730.             if l > 0 then CmdLine.Add( '-v' );        //    l[0|1|2]                ôWèJâìâOé╠âtâ@âCâïû╝é╠ò\Īû@é╠ò╧ìX
  731.  
  732. //            CmdLine.AddIntOpt( 'm'  ,m   );            //    m[0|1|2]                Ä┐ûΓé╔ yes é╞ë╝ÆΦ
  733.             if n > 0 then CmdLine.Add( '-q' );        //    n[0|1]                ôWèJÅ≤ï╡â_âCâAâìâOò\Īé╠ù}Ä~
  734. //            CmdLine.AddIntOpt( 'o'  ,o   );            //    o[0|1|2]                ïîî`Ä«é┼Åæî╔é≡ì∞ɼ
  735. //            CmdLine.AddIntOpt( 'p'  ,p   );            //    p[0|1|2]                æSâpâXû╝é┼ìçÆv
  736.             if r > 0 then CmdLine.Add( '-r' );        //    r[0|1|2]                ì─ïAôIîƒì⌡
  737. //            CmdLine.AddIntOpt( 's'  ,s   );            //    s[0|1]                âXâLâbâvò\Īé╠ù}ɺ
  738.             if n > 0 then CmdLine.Add( '-o' );        //    t[0|1]                Åæî╔é╠ìXÉVô·Ä₧é╠ÄwÆΦ
  739.             if u > 0 then CmdLine.Add( '-u' );        //    u[0|1]                âtâ@âCâïé╠ìXÉVüiÉVé╡éóéαé╠üj
  740. //            CmdLine.AddIntOpt( 'w'  ,w   );            //    w[0|1|<Dirû╝>]        ì∞ï╞ùpâfâBâîâNâgâèé╠ÄwÆΦ
  741.             if x = 0 then CmdLine.Add( '-j' );        //    x[0|1]                âfâBâîâNâgâèû╝é≡ùLî°é╔é╖éΘ
  742. //            CmdLine.AddIntOpt( 'y'  ,y   );            //    y[0|1]                æSé─é╠Ä┐ûΓé╔ yes é╞ë╝ÆΦ
  743. //            CmdLine.AddIntOpt( 'z'  ,z   );            //    z[0|1|2|<ègÆúÄq>]    ûóê│Åkâtâ@âCâïé╠ÄwÆΦ            ###ègÆúÄqé═âTâ|ü[âgé╡é╚éó###
  744.             if jc > 0 then CmdLine.Add( '-FF' );    //    jc[0|1]                öjæ╣âwâbâ_é≡û│Äï
  745. //            CmdLine.AddIntOpt( 'jd' ,jd  );            //    jd[<âTâCâY>]        âfâBâXâNé╠ï≤é½ùeù╩é≡èmöF
  746. //            CmdLine.AddIntOpt( 'je' ,je  );            //    je[<âTâCâY>]        Huffman âoâbâtâ@é╠æσé½é│é≡ÄwÆΦ
  747. //            CmdLine.AddIntOpt( 'jf' ,jf  );            //    jf[0|1]                âïü[âgïLìåé╠ìφÅ£
  748. //            CmdLine.AddIntOpt( 'jh' ,jh  );            //    jh[0|1]                WindowsNT/95 ÉΩùpé╠â}ü[âNé≡Åæî╔é╔òtë┴
  749.             if ji > 0 then CmdLine.Add( '-k' );        //    ji[0|1]                ÆZéóâtâ@âCâïû╝é┼èiö[
  750.             CmdLine.AddIntOpt( ''   ,jm  );            //    jm[0|1|2|3|4]        ê│Åkî`Ä«é≡ÄwÆΦ
  751. //            CmdLine.AddIntOpt( 'jn' ,jn  );            //    jn[0|1]                ÉVïKâtâ@âCâïé╠é▌
  752.  
  753. //            CmdLine.AddStrOpt( 't ' ,zdate( jo  ));//    jo [<Ä₧ìÅÄwÆΦ>]    YYMMDDHHMMSS é╠ô·òtê╚ì~
  754. //            CmdLine.AddStrOpt( 'tt ',zdate( job ));//    job[<Ä₧ìÅÄwÆΦ>]    YYMMDDHHMMSS é╠ô·òtê╚æO
  755.  
  756. //            AddDateOpt( 't' ,jo  );                        //    jo [<Ä₧ìÅÄwÆΦ>]    YYMMDDHHMMSS é╠ô·òtê╚ì~
  757. //            AddDateOpt( 'tt',job );                        //    job[<Ä₧ìÅÄwÆΦ>]    YYMMDDHHMMSS é╠ô·òtê╚æO
  758.  
  759. //            CmdLine.AddIntOpt( 'jp' ,jp  );            //    jp[0|1]                ÉiÆ╗âoü[é≡âvâìâOâîâXüEâoü[é┼ò\Ī
  760. //            CmdLine.AddIntOpt( 'jr' ,jr  );            //    jr[0|1]                âtâ@âCâïé╠Æué½è╖éª
  761. //            CmdLine.AddIntOpt( 'jss',jss );            //    jss[0|1]                ê│Åkâtâ@âCâïâIü[âvâôâGâëü[é≡û│ÄïüBÆ╩ÅφüCê│ÅkÄ₧é╔ê│Åkæ╬Å█âtâ@
  762. //            CmdLine.AddIntOpt( 'jw' ,jw  );            //    jw[0|1|2|3|4]        WinSFX/WinSFXM é≡ì∞ɼ
  763. //            CmdLine.AddLstOpt( 'jx' ,jx  );            //    jx[<âtâ@âCâïû╝>]    Å£èOé╖éΘâtâ@âCâïû╝
  764. //            CmdLine.AddIntOpt( 'jyc',jyc );            //    jyc[0|1]                âfâBâîâNâgâèì∞ɼé╠èmöFé≡Å╚ù¬
  765. //            CmdLine.AddIntOpt( 'jyd',jyd );            //    jyd[0|1]                âtâ@âCâïìφÅ£é╠èmöFé≡Å╚ù¬
  766. //            CmdLine.AddIntOpt( 'jyk',jyk );            //    jyk[0|1]                Ägùpé┼é½éΘâfâBâXâNùeù╩é╠èmöFé╠Å╚ù¬
  767. //            CmdLine.AddIntOpt( 'jyn',jyn );            //    jyn[0|1]                ÉVâtâ@âCâïû╝é╠ùvïüé╠Å╚ù¬
  768. //            CmdLine.AddIntOpt( 'jyo',jyo );            //    jyo[0|1]                è∙æ╢âtâ@âCâïé╓é╠ÅπÅæé½èmöFé╠Å╚ù¬
  769. //            CmdLine.AddStrOpt( 'jz' ,jz  );            //    jz[<âtâ@âCâïû╝>]    âtâ@âCâïÆìÄ▀é╠âtâ@âCâïé≡ïƒïï
  770. //            CmdLine.AddIntOpt( 'ga' ,ga  );            //    ga[0|1]                Åæé½ì₧é▌òsë┬æ«É½é≡û│Äï
  771.             if gd > 0 then CmdLine.Add( '-J' );        //    gd[0|1]                ù]ò¬é╚âfü[â^é╠ìφÅ£
  772. //            CmdLine.AddIntOpt( 'ge' ,ge  );            //    ge[0|1]                ì┼Åëé╠ègÆúÄqé≡öFÄ»
  773. //            CmdLine.AddIntOpt( 'gf' ,gf  );            //    gf[0|1|2]            é╖é┼é╔éáéΘâtâ@âCâïé╠ìXÉV
  774. //            CmdLine.AddIntOpt( 'gj' ,gj  );            //    gj[0|1]                x û╜ù▀é≡ e û╜ù▀é╞ô»ùlé╞î⌐é╚é╖
  775. //            CmdLine.AddIntOpt( 'gm' ,gm  );            //    gm[0|1]                âGâëü[âüâbâZü[âWò\Īé╠ù}Ä~
  776. //            CmdLine.AddIntOpt( 'gn' ,gn  );            //    gn[0|1|2]            ôWèJâtâ@âCâïé╠ìçîvâTâCâYé≡ 100% é╞é╡é╜ÉiÆ╗âOâëâté╠ò\Ī
  777. //            CmdLine.AddIntOpt( 'go' ,go  );            //    go[0|1]                â_âCâAâìâOé╠âIü[âiü[âEâBâôâhâEé╠ÄwÆΦ
  778. //            CmdLine.AddIntOpt( 'gp' ,gp  );            //    gp[0|1]                âEâBâôâhâEé≡ Disable é╔é╡é╚éó
  779. //            CmdLine.AddIntOpt( 'gr' ,gr  );            //    gr[<âtâ@âCâïû╝>]    ò╧ìXâtâ@âCâïû╝é≡ïƒïï
  780. //            CmdLine.AddIntOpt( 'gs' ,gs  );            //    gs[<âTâCâY>]        âwâbâ_îƒì⌡âTâCâYé╠ÄwÆΦ
  781. //            CmdLine.AddIntOpt( 'gu' ,gu  );            //    gu[0|1]                WinSFXüCDosSFX é╔æSé─é╠âtâ@âCâïé≡èiö[
  782. //            CmdLine.AddIntOpt( 'gw' ,gw  );            //    gw[0|1|2|3|4]        WinSFX32/WinSFX32M é≡ì∞ɼ
  783.  
  784.             CmdLine.Add( UserOptions );
  785.  
  786.             AddFileSpec1( CmdLine,ArchiveFileName,Path );
  787.             AddFileSpec2( CmdLine,Options,FileList,UseResFile );
  788.  
  789.             result := cmd + CmdLine.Str;
  790.         finally
  791.             CmdLine.Free;
  792.         end;
  793.     end;
  794. end;
  795.  
  796. function TZip32.FindOpen( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ):THARC;
  797. begin
  798.     result:= FArchiver.OpenArchive( Handle,PChar( ExpandFileName( ArchiveFileName )),dwMode );
  799. end;
  800.  
  801. function TZip32.FindClose( hArc:THArc ):integer;
  802. begin
  803.     result := FArchiver.CloseArchive( hArc );
  804. end;
  805.  
  806. function TZip32.FindFirst( hArc:THArc;var IndivisualInfo:TIndivisualInfo;FileMask:string ):integer;
  807. begin
  808.     result := FArchiver.FindFirst( hArc,PChar( FileMask ),@IndivisualInfo );
  809. end;
  810.  
  811. function TZip32.FindNext( hArc:THArc;var IndivisualInfo:TIndivisualInfo ):integer;
  812. begin
  813.     result := FArchiver.FindNext( hArc,@IndivisualInfo )
  814. end;
  815.  
  816. //    function IsZipArchive( ArchiveFileName:string ):boolean;
  817. //    var
  818. //        SfxType:    integer;
  819. //    begin
  820. //        try
  821. //            LoadDll;
  822. //            SfxType:= UnZipCheckArchive( PChar( ExpandFileName( ArchiveFileName )),CHECKARCHIVE_SFX+CHECKARCHIVE_ALL );
  823. //            result := ( SfxType <> 0 );
  824. //        except
  825. //            result := false;
  826. //        end;
  827. //    end;
  828.  
  829. function IsZipArchive( ArchiveFileName:string ):boolean;
  830. var
  831.     hArc:        THARC;
  832. begin
  833.     try
  834.         LoadDLL;
  835.         ArchiveFileName := ExpandFileName( ArchiveFileName );
  836.         result := false;
  837.         if not FileExists( ArchiveFileName ) then exit;
  838.         hArc := FArchiver.OpenArchive( 0,PAnsiChar( ArchiveFileName ),M_REGARDLESS_INIT_FILE+M_ERROR_MESSAGE_OFF );
  839.         if hArc <> 0 then FArchiver.CloseArchive( hArc );
  840.         result := ( hArc <> 0 );
  841.     except
  842.         result := false;
  843.     end;
  844. end;
  845.  
  846.  
  847. end.
  848.