home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 March / Chip_2002-03_cd1.bin / zkuste / delphi / kompon / d5 / cak / CAKINST.ZIP / cmarc139.lzh / CAB32.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  2001-07-16  |  12.4 KB  |  276 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. // CAB32è╓ÿAâéâWâàü[âï    CAB32.PAS
  6. //
  7. // v1.00:Åëè·î÷èJâoü[âWâçâô
  8. //       âAü[âJâCâué╠ôWèJï@ö\é¬ô¡é⌐é╚éó
  9. // v1.01:Open/Close âüâ\âbâhé≡ FindOpen/FindClose é╔ëⁿû╝
  10. //       ôWèJï@ö\é¬ô¡é⌐é╚éóî╗Å█é╠æ╬ì⌠(Åæî╔û╝é≡âtâïâpâXû╝é┼ù^éªé╜)
  11. // v1.02:âtâ@âCâïâèâXâgâpâëâüü[â^é╠î^é≡ TStrings é╔ò╧ìX
  12. //       â^âCâgâïé╠âRâüâôâgé≡Äßè▒ò╧ìX
  13. // v1.03:Delphi 3 é╔æ╬ë₧
  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. //       ôαòöâüâ\âbâhé╠Ä└æòé≡Äßè▒ò╧ìX
  25. // v1.16:CAB î`Ä«é┼é╠ r âIâvâVâçâôÅêù¥é≡Ä└æò
  26. // v1.17:LoadDll/FreeDll/IsXXXArchive é╠ì\ɼò╧ìX
  27. // v1.20:Ä⌐î╚ë≡ôÇÅæî╔ì∞ɼâpâXÄwÆΦï@ö\Æ╟ë┴
  28. // v1.21:LoadDll/FreeDll é╠ë┬Äïâîâxâïé≡ò╧ìX
  29. // v1.22:îoë▀âCâxâôâgâTâ|ü[âgé≡Æ╟ë┴
  30. // v1.23:CheckArchive âüâ\âbâhé≡Æ╟ë┴
  31. //       Äσé╚âüâ\âbâhé╠ëⁿû╝
  32. // v1.25:ZIP32J.DLLé┼é╠û╝æOé╔"["é≡è▄é▐âtâ@âCâïé╓é╠æ╬ë₧
  33. // v1.26:CAB32.DLL v0.81 é╔æ╬ë₧
  34. // v1.28:âüâéâèôWèJï@ö\é╠âTâ|ü[âgé≡Æ╟ë┴
  35. //          CheckArchive âüâ\âbâhé╠û▀éΦÆlé╠î^é≡ò╧ìX
  36. // v1.30:èeâüâ\âbâhé╠ FileList ê°Éöé╠î^é≡ò╧ìX
  37. // v1.32:IsSetOwnerWinow/KillOwnerWindow é╠Ä└æòé≡ò╧ìX
  38. // v1.35:TCab32.Cab é¬ CmdLine ê°Éöé≡î⌐é─éóé╚é⌐é┴é╜òsï∩ìçé╠ÅCÉ│
  39. // v1.37:êΩÄ₧âfâBâîâNâgâèÄwÆΦâIâvâVâçâôé╠âTâ|ü[âgé≡Æ╟ë┴
  40. // v1.38:DLL é⌐éτé╠âGâôâgâèâ|âCâôâgé╠ĵô╛ò√û@é≡ò╧ìXé╡é╜
  41. //
  42. unit CAB32;
  43.  
  44. interface
  45.  
  46. uses Windows,SysUtils,Classes,Archives;
  47.  
  48. type
  49.     TCab32 = class( TArchiver )
  50.     protected
  51.         class procedure LoadDll; override;
  52.         class procedure FreeDll; override;
  53.  
  54.     protected
  55.         function BuildCmdLine( Cmd,ArchiveFileName:string;Options:TArchiverOptions;Path:String;FileList:array of const;UseResFile:boolean ):String;
  56.  
  57.         function FindOpen ( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ):THARC; override;
  58.         function FindFirst( hArc:THArc;var IndivisualInfo:TIndivisualInfo;FileMask:string ):integer; override;
  59.         function FindNext ( hArc:THArc;var IndivisualInfo:TIndivisualInfo                 ):integer; override;
  60.         function FindClose( hArc:THArc                                                    ):integer; override;
  61.  
  62.     public
  63.         function Cab( Handle:HWND;CmdLine:string;var Output:string ):integer;
  64.         function UnpackFiles  ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;DstPath:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; override;
  65.         function PackFiles    ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; override;
  66. //        function RemoveItem   ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer; override;
  67.         function MakeSfx      ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;DstPath:String                                           ;var Output:string ):Integer; override;
  68.         function UnpackToMem  ( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD         ):Integer; override;
  69.         function CheckArchive (             ArchiveFileName:string;CheckMode:integer;CheckOptions:integer ):DWORD; override;
  70.  
  71.         function SetOwnerWindowEx ( Handle:HWND;lpArcProc:LPARCHIVERPROC ):boolean; override;
  72.         function KillOwnerWindowEx( Handle:HWND                          ):boolean; override;
  73.     end;
  74.  
  75.     function IsCabArchive( ArchiveFileName:string ):boolean;
  76.  
  77. implementation
  78.  
  79. //---------------------------------------------------------------------
  80. var
  81.     FArchiver:        TArchiverDLL;
  82.  
  83. procedure LoadDll;
  84. begin
  85.     if Assigned( FArchiver ) then exit;
  86.     FArchiver := TArchiverDll.Create( 'CAB î`Ä«Åæî╔','CAB32.DLL','Cab' );
  87.     FArchiver.LoadDLL;
  88. end;
  89.  
  90. procedure FreeDll;
  91. begin
  92.     FArchiver.Free;
  93.     FArchiver := nil;
  94. end;
  95.  
  96. //---------------------------------------------------------------------
  97. class procedure TCab32.LoadDll;
  98. begin
  99.     Cab32.LoadDll;
  100. end;
  101.  
  102. class procedure TCab32.FreeDll;
  103. begin
  104.     Cab32.FreeDll;
  105. end;
  106.  
  107. function TCab32.UnpackFiles( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;DstPath:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer;
  108. begin
  109.     FCmdLine := BuildCmdLine( '-x',ExpandFileName( ArchiveFileName ),Options,DstPath,FileList,ruOnUnpack in Options.ResFileUsage );
  110.     result := CAB( Handle,FCmdLine,Output );
  111. end;
  112.  
  113. function TCab32.PackFiles( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;BaseDir:String;FileList:array of const;UseResFile:boolean;var Output:string ):Integer;
  114. begin
  115.     FCmdLine := BuildCmdLine( '-a',ArchiveFileName,Options,BaseDir,FileList,ruOnPack in Options.ResFileUsage );
  116.     result := CAB( Handle,FCmdLine,Output );
  117. end;
  118.  
  119. function TCab32.MakeSfx( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;DstPath:String;var Output:string ):Integer;
  120. begin
  121.     FCmdLine := BuildCmdLine( '-f',ArchiveFileName,Options,DstPath,[nil],false );
  122.     result := CAB( Handle,FCmdLine,Output );
  123. end;
  124.  
  125. function TCab32.UnpackToMem( Handle:HWND;ArchiveFileName:string;Options:TArchiverOptions;FileName:string;lpvBuffer:LPVOID;dwSize:DWORD;lpdwWriteSize:LPDWORD ):Integer;
  126. begin
  127.     FCmdLine := BuildCmdLine( '',ArchiveFileName,Options,'',[FileName],false );
  128.     result := FArchiver.ExtractMem( Handle,PChar( FCmdLine ),lpvBuffer,dwSize,nil,nil,lpdwWriteSize );
  129. end;
  130.  
  131. function TCab32.CheckArchive( ArchiveFileName:string;CheckMode:integer;CheckOptions:integer ):DWORD;
  132. begin
  133.     result := FArchiver.CheckArchive( PChar( ArchiveFileName ),CheckMode+CheckOptions );
  134. end;
  135.  
  136. function TCab32.CAB( Handle:HWND;CmdLine:string;var Output:string ):integer;
  137. begin
  138.     result := FArchiver.ArchiverProc( Handle,PChar( CmdLine ),PAnsiChar( Output ),Length( Output ));
  139. end;
  140.  
  141. function TCab32.BuildCmdLine( Cmd,ArchiveFileName:string;Options:TArchiverOptions;Path:String;FileList:array of const;UseResFile:boolean ):String;
  142. var
  143.     CmdLine:    TCmdOpt;
  144. begin
  145.     with Options do begin
  146.         CmdLine := TCmdOpt.Create;
  147. //        CmdLine.Add( '-+' );            //    Åφé╔âîâWâXâgâèé╠É▌ÆΦé≡û│Äïé╖éΘ
  148.  
  149. //        CmdLine.AddIntOpt( 'a'  ,a   );        //    a[0|1|2]                æ«É½é╠ì─î╗üB
  150.         if c=1 then CmdLine.Add( '-o' );        //    c[0|1]                â^âCâÇâXâ^âôâvîƒì╕é≡Å╚ù¬
  151. //        CmdLine.AddIntOpt( 'd'  ,d   );        //    d[0|1]                âfâBâîâNâgâèû╝é╠èiö[
  152. //        CmdLine.AddIntOpt( 'e'  ,e   );        //    e[0|1]                Ä½ÅæâTâCâYé≡ö╝ò¬é╔é╡é─ê│Åk
  153. //        CmdLine.AddIntOpt( 'f'  ,f   );        //    f[0|1]                âfâBâXâNÄcù╩â`âFâbâNé╠ÆåÄ~
  154. //        CmdLine.AddIntOpt( 'h'  ,h   );        //    h[0|1|2|3]            âwâbâ_é╠î`Ä«é≡ÄwÆΦ
  155. //        CmdLine.AddIntOpt( 'i'  ,i   );        //    i[0|1|2]                âtâ@âCâïæIæ≡é┼æσò╢ÄÜé╞żò╢ÄÜé≡ïµò╩
  156. //        CmdLine.AddIntOpt( 'l'  ,l   );        //    l[0|1|2]                ôWèJâìâOé╠âtâ@âCâïû╝é╠ò\Īû@é╠ò╧ìX
  157. //        CmdLine.AddIntOpt( 'm'  ,m   );        //    m[0|1|2]                Ä┐ûΓé╔ yes é╞ë╝ÆΦ
  158.         if( n > 0 )or( CallbackEnabled )
  159.         then CmdLine.Add( '-i' );                //    n[0|1]                ôWèJÅ≤ï╡â_âCâAâìâOò\Īé╠ù}Ä~
  160. //        CmdLine.AddIntOpt( 'o'  ,o   );        //    o[0|1|2]                ïîî`Ä«é┼Åæî╔é≡ì∞ɼ
  161. //        CmdLine.AddIntOpt( 'p'  ,p   );        //    p[0|1|2]                æSâpâXû╝é┼ìçÆv
  162.         if r>0 then CmdLine.Add( '-r' );        //    r[0|1|2]                ì─ïAôIîƒì⌡
  163. //        CmdLine.AddIntOpt( 's'  ,s   );        //    s[0|1]                âXâLâbâvò\Īé╠ù}ɺ
  164. //        CmdLine.AddIntOpt( 't'  ,t   );        //    t[0|1]                Åæî╔é╠ìXÉVô·Ä₧é╠ÄwÆΦ
  165.  
  166. //        CmdLine.AddIntOpt( 'u'  ,u   );        //    u[0|1]                âtâ@âCâïé╠ìXÉVüiÉVé╡éóéαé╠üj
  167.         CmdLine.AddPath1 ( 'h'  ,w   );        //    w[0|1|<Dirû╝>]        ì∞ï╞ùpâfâBâîâNâgâèé╠ÄwÆΦ
  168.         if x=0 then CmdLine.Add( '-j' );        //    x[0|1]                âfâBâîâNâgâèû╝é≡ùLî°é╔é╖éΘ
  169. //        CmdLine.AddIntOpt( 'y'  ,y   );        //    y[0|1]                æSé─é╠Ä┐ûΓé╔ yes é╞ë╝ÆΦ
  170. //        CmdLine.AddIntOpt( 'z'  ,z   );        //    z[0|1|2|<ègÆúÄq>]    ûóê│Åkâtâ@âCâïé╠ÄwÆΦ            ###ègÆúÄqé═âTâ|ü[âgé╡é╚éó###
  171. //        CmdLine.AddIntOpt( 'jc' ,jc  );        //    jc[0|1]                öjæ╣âwâbâ_é≡û│Äï
  172. //        CmdLine.AddIntOpt( 'jd' ,jd  );        //    jd[<âTâCâY>]        âfâBâXâNé╠ï≤é½ùeù╩é≡èmöF
  173. //        CmdLine.AddIntOpt( 'je' ,je  );        //    je[<âTâCâY>]        Huffman âoâbâtâ@é╠æσé½é│é≡ÄwÆΦ
  174. //        CmdLine.AddIntOpt( 'jf' ,jf  );        //    jf[0|1]                âïü[âgïLìåé╠ìφÅ£
  175. //        CmdLine.AddIntOpt( 'jh' ,jh  );        //    jh[0|1]                WindowsNT/95 ÉΩùpé╠â}ü[âNé≡Åæî╔é╔òtë┴
  176.         if ji>0 then CmdLine.Add( '-q' );    //    ji[0|1]                ÆZéóâtâ@âCâïû╝é┼èiö[
  177. //        CmdLine.AddIntOpt( 'jm' ,jm  );        //    jm[0|1|2|3|4]        ê│Åkî`Ä«é≡ÄwÆΦ
  178. //        CmdLine.AddIntOpt( 'jn' ,jn  );        //    jn[0|1]                ÉVïKâtâ@âCâïé╠é▌
  179. //        CmdLine.AddStrOpt( 'jo' ,jo  );        //    jo[<Ä₧ìÅÄwÆΦ>]        YYMMDDHHMMSS é╠ô·òtê╚ì~
  180. //        CmdLine.AddStrOpt( 'job',job );        //    job[<Ä₧ìÅÄwÆΦ>]    YYMMDDHHMMSS é╠ô·òtê╚æO
  181. //        CmdLine.AddIntOpt( 'jp' ,jp  );        //    jp[0|1]                ÉiÆ╗âoü[é≡âvâìâOâîâXüEâoü[é┼ò\Ī
  182. //        CmdLine.AddIntOpt( 'jr' ,jr  );        //    jr[0|1]                âtâ@âCâïé╠Æué½è╖éª
  183. //        CmdLine.AddIntOpt( 'jss',jss );        //    jss[0|1]                ê│Åkâtâ@âCâïâIü[âvâôâGâëü[é≡û│ÄïüBÆ╩ÅφüCê│ÅkÄ₧é╔ê│Åkæ╬Å█âtâ@
  184. //        CmdLine.AddIntOpt( 'jw' ,jw  );        //    jw[0|1|2|3|4]        WinSFX/WinSFXM é≡ì∞ɼ
  185. //        CmdLine.AddLstOpt( 'jx' ,jx  );        //    jx[<âtâ@âCâïû╝>]    Å£èOé╖éΘâtâ@âCâïû╝
  186. //        CmdLine.AddIntOpt( 'jyc',jyc );        //    jyc[0|1]                âfâBâîâNâgâèì∞ɼé╠èmöFé≡Å╚ù¬
  187. //        CmdLine.AddIntOpt( 'jyd',jyd );        //    jyd[0|1]                âtâ@âCâïìφÅ£é╠èmöFé≡Å╚ù¬
  188. //        CmdLine.AddIntOpt( 'jyk',jyk );        //    jyk[0|1]                Ägùpé┼é½éΘâfâBâXâNùeù╩é╠èmöFé╠Å╚ù¬
  189. //        CmdLine.AddIntOpt( 'jyn',jyn );        //    jyn[0|1]                ÉVâtâ@âCâïû╝é╠ùvïüé╠Å╚ù¬
  190. //        CmdLine.AddIntOpt( 'jyo',jyo );        //    jyo[0|1]                è∙æ╢âtâ@âCâïé╓é╠ÅπÅæé½èmöFé╠Å╚ù¬
  191. //        CmdLine.AddStrOpt( 'jz' ,jz  );        //    jz[<âtâ@âCâïû╝>]    âtâ@âCâïÆìÄ▀é╠âtâ@âCâïé≡ïƒïï
  192. //        CmdLine.AddIntOpt( 'ga' ,ga  );        //    ga[0|1]                Åæé½ì₧é▌òsë┬æ«É½é≡û│Äï
  193. //        CmdLine.AddIntOpt( 'gd' ,gd  );        //    gd[0|1]                ù]ò¬é╚âfü[â^é╠ìφÅ£
  194. //        CmdLine.AddIntOpt( 'ge' ,ge  );        //    ge[0|1]                ì┼Åëé╠ègÆúÄqé≡öFÄ»
  195. //        CmdLine.AddIntOpt( 'gf' ,gf  );        //    gf[0|1|2]            é╖é┼é╔éáéΘâtâ@âCâïé╠ìXÉV
  196. //        CmdLine.AddIntOpt( 'gj' ,gj  );        //    gj[0|1]                x û╜ù▀é≡ e û╜ù▀é╞ô»ùlé╞î⌐é╚é╖
  197. //        CmdLine.AddIntOpt( 'gm' ,gm  );        //    gm[0|1]                âGâëü[âüâbâZü[âWò\Īé╠ù}Ä~
  198. //        CmdLine.AddIntOpt( 'gn' ,gn  );        //    gn[0|1|2]            ôWèJâtâ@âCâïé╠ìçîvâTâCâYé≡ 100% é╞é╡é╜ÉiÆ╗âOâëâté╠ò\Ī
  199. //        CmdLine.AddIntOpt( 'go' ,go  );        //    go[0|1]                â_âCâAâìâOé╠âIü[âiü[âEâBâôâhâEé╠ÄwÆΦ
  200. //        CmdLine.AddIntOpt( 'gp' ,gp  );        //    gp[0|1]                âEâBâôâhâEé≡ Disable é╔é╡é╚éó
  201. //        CmdLine.AddIntOpt( 'gr' ,gr  );        //    gr[<âtâ@âCâïû╝>]    ò╧ìXâtâ@âCâïû╝é≡ïƒïï
  202. //        CmdLine.AddIntOpt( 'gs' ,gs  );        //    gs[<âTâCâY>]        âwâbâ_îƒì⌡âTâCâYé╠ÄwÆΦ
  203. //        CmdLine.AddIntOpt( 'gu' ,gu  );        //    gu[0|1]                WinSFXüCDosSFX é╔æSé─é╠âtâ@âCâïé≡èiö[
  204. //        CmdLine.AddIntOpt( 'gw' ,gw  );        //    gw[0|1|2|3|4]        WinSFX32/WinSFX32M é≡ì∞ɼ
  205.  
  206.         CmdLine.Add( UserOptions );
  207.  
  208.         AddFileSpec1( CmdLine,ArchiveFileName,Path );
  209.         AddFileSpec2( CmdLine,Options,FileList,UseResFile );
  210.  
  211.         result := cmd + CmdLine.Str;
  212.         CmdLine.Free;
  213.     end;
  214. end;
  215.  
  216. function TCab32.FindOpen( Handle:HWND;ArchiveFileName:string;dwMode:DWORD ):THARC;
  217. begin
  218.     result:= FArchiver.OpenArchive( Handle,PChar( ExpandFileName( ArchiveFileName )),dwMode );
  219. end;
  220.  
  221. function TCab32.FindClose( hArc:THArc ):integer;
  222. begin
  223.     result := FArchiver.CloseArchive( hArc );
  224. end;
  225.  
  226. function TCab32.FindFirst( hArc:THArc;var IndivisualInfo:TIndivisualInfo;FileMask:string ):integer;
  227. begin
  228.     result := FArchiver.FindFirst( hArc,PChar( FileMask ),@IndivisualInfo );
  229. end;
  230.  
  231. function TCab32.FindNext( hArc:THArc;var IndivisualInfo:TIndivisualInfo ):integer;
  232. begin
  233.     result := FArchiver.FindNext( hArc,@IndivisualInfo )
  234. end;
  235.  
  236. function TCab32.SetOwnerWindowEx( Handle:HWND;lpArcProc:LPARCHIVERPROC ):boolean;
  237. begin
  238.     inherited SetOwnerWindowEx( Handle,lpArcProc );
  239.     result := FArchiver.SetOwnerWindowEx( Handle,lpArcProc );
  240. end;
  241.  
  242. function TCab32.KillOwnerWindowEx( Handle:HWND ):boolean;
  243. begin
  244.     result := FArchiver.KillOwnerWindowEx( Handle );
  245.     inherited KillOwnerWindowEx( Handle );
  246. end;
  247.  
  248. //    function IsCabArchive( ArchiveFileName:string ):boolean;
  249. //    var
  250. //        SfxType:    integer;
  251. //    begin
  252. //        try
  253. //            LoadDll;
  254. //            SfxType:= FArchiver.CheckArchive( PChar( ExpandFileName( ArchiveFileName )),CHECKARCHIVE_SFX+CHECKARCHIVE_ALL );
  255. //            result := ( SfxType <> 0 );
  256. //        except
  257. //            result := false;
  258. //        end;
  259. //    end;
  260.  
  261. function IsCabArchive( ArchiveFileName:string ):boolean;
  262. var
  263.     hArc:        THARC;
  264. begin
  265.     try
  266.         LoadDLL;
  267.         hArc := FArchiver.OpenArchive( 0,PAnsiChar( ExpandFileName( ArchiveFileName )),M_REGARDLESS_INIT_FILE+M_ERROR_MESSAGE_OFF );
  268.         FArchiver.CloseArchive( hArc );
  269.         result := ( hArc <> 0 );
  270.     except
  271.         result := false;
  272.     end;
  273. end;
  274.  
  275. end.
  276.