home *** CD-ROM | disk | FTP | other *** search
/ ftp.rarlab.com / 2014.05.ftp.rarlab.com.tar / ftp.rarlab.com / rar / RARComponent_12.zip / RAR_DLL.pas < prev    next >
Pascal/Delphi Source File  |  2009-02-01  |  6KB  |  223 lines

  1. //  written by Philippe Wechsler 2008
  2. //
  3. //  web: www.PhilippeWechsler.ch
  4. //  mail: contact@PhilippeWechsler.ch
  5. //
  6. //  please see license.txt and documentation.txt
  7. //
  8. //  changes in 1.2 stable
  9. //   - support for delphi 2009
  10. //   - support for unicode filenames (see TRARFileItem.FileNameW)
  11. //   - dll name + path is custom
  12. //   - fixed a memory leak (thanks to Claes EnskΣr)
  13. //   - some small improvements in the demo
  14. //  changes in 1.1 stable
  15. //   - fixed problem with mySelf pointer - you can use now multiple TRAR instances
  16. //   - "SFX" in archive informations
  17. //   - code better commented
  18. //   - bugfixing in reading multivolumes
  19. //
  20. //  known bugs:
  21. //   - when extracting files that contains unicode characters there's no test if
  22. //     the file exists allready
  23. //   - open archives that contains unicode characters in the archive name fails
  24.  
  25. unit RAR_DLL;
  26.  
  27. interface
  28.  
  29. uses
  30.   Windows,SysUtils;
  31.  
  32. const
  33.   RAR_METHOD_STORE=48;
  34.   RAR_METHOD_FASTEST=49;
  35.   RAR_METHOD_FAST=50;
  36.   RAR_METHOD_NORMAL=51;
  37.   RAR_METHOD_GOOD=52;
  38.   RAR_METHOD_BEST=53;
  39.  
  40.   RAR_SUCCESS=0;
  41.   ERAR_COMMENTS_EXISTS=1;
  42.   ERAR_NO_COMMENTS=0;
  43.   ERAR_DLL_LOAD_ERROR=99;
  44.   ERAR_END_ARCHIVE=10;
  45.   ERAR_NO_MEMORY=11;
  46.   ERAR_BAD_DATA=12;
  47.   ERAR_BAD_ARCHIVE=13;
  48.   ERAR_UNKNOWN_FORMAT=14;
  49.   ERAR_EOPEN=15;
  50.   ERAR_ECREATE=16;
  51.   ERAR_ECLOSE=17;
  52.   ERAR_EREAD=18;
  53.   ERAR_EWRITE=19;
  54.   ERAR_SMALL_BUF=20;
  55.   ERAR_UNKNOWN=21;
  56.  
  57.   RAR_OM_LIST=0;
  58.   RAR_OM_EXTRACT=1;
  59.   RAR_OM_LIST_INCSPLIT=2;
  60.   RAR_SKIP=0;
  61.   RAR_TEST=1;
  62.   RAR_EXTRACT=2;
  63.   RAR_VOL_ASK=0;
  64.   RAR_VOL_NOTIFY=1;
  65.   RAR_DLL_VERSION=3;
  66.  
  67.   UCM_CHANGEVOLUME=0;
  68.   UCM_PROCESSDATA=1;
  69.   UCM_NEEDPASSWORD=2;
  70.  
  71.   MAX_RAR_COMMENTSIZE=65536;
  72.   MIN_RAR_VERSION=4;
  73.  
  74. type
  75.   TProcessDataProc=function(Addr: PByte; Size: integer): integer; stdcall;
  76.   TChangeVolProc=function(ArcName: PAnsiChar; Mode: integer): integer; stdcall;
  77.   TUnRarCallBack =function(msg: Cardinal; UserData, P1, P2: longint): integer; stdcall;
  78.  
  79.   TRARArchiveData = record
  80.     ArcName:PAnsiChar;
  81.     OpenMode:cardinal;
  82.     OpenResult:cardinal;
  83.     CmtBuf:PAnsiChar;
  84.     CmtBufSize:cardinal;
  85.     CmtSize:cardinal;
  86.     CmtState:cardinal;
  87.   end;
  88.   PRARArchiveData=^TRARArchiveData;
  89.  
  90.   TRARArchiveDataEx = record
  91.     ArcName:PAnsiChar;
  92.     ArcNameW:PWideChar;
  93.     OpenMode:cardinal;
  94.     OpenResult:cardinal;
  95.     CmtBuf:PAnsiChar;
  96.     CmtBufSize:cardinal;
  97.     CmtSize:cardinal;
  98.     CmtState:cardinal;
  99.     Flags:cardinal;
  100.     Reserved:array[1..32] of cardinal;
  101.   end;
  102.   PRARArchiveDataEx = ^TRARArchiveDataEx;
  103.  
  104.   TRARHeaderData = record
  105.     ArcName: array[0..259] of AnsiChar;
  106.     FileName: array[0..259] of AnsiChar;
  107.     Flags:cardinal;
  108.     PackSize:cardinal;
  109.     UnpSize:cardinal;
  110.     HostOS:cardinal;
  111.     FileCRC:cardinal;
  112.     FileTime:cardinal;
  113.     UnpVer:cardinal;
  114.     Method:cardinal;
  115.     FileAttr:cardinal;
  116.     CmtBuf:PAnsiChar;
  117.     CmtBufSize:cardinal;
  118.     CmtSize:cardinal;
  119.     CmtState:cardinal;
  120.   end;
  121.   PRARHeaderData=^TRARHeaderData;
  122.  
  123.   //for UniCode FileNames and 64-Bit Sizes
  124.   TRARHeaderDataEx = record
  125.     ArcName:array[0..1023] of AnsiChar;
  126.     ArcNameW:array[0..1023] of WideChar;
  127.     FileName:array[0..1023] of AnsiChar;
  128.     FileNameW:array[0..1023] of WideChar;
  129.     Flags:cardinal;
  130.     PackSize:cardinal;
  131.     PackSizeHigh:cardinal;
  132.     UnpSize:cardinal;
  133.     UnpSizeHigh:cardinal;
  134.     HostOS:cardinal;
  135.     FileCRC:cardinal;
  136.     FileTime:cardinal;
  137.     UnpVer:cardinal;
  138.     Method:cardinal;
  139.     FileAttr:cardinal;
  140.     CmtBuf:PAnsiChar;
  141.     CmtBufSize:cardinal;
  142.     CmtSize:cardinal;
  143.     CmtState:cardinal;
  144.     Reserved:array[1..1024] of cardinal;
  145.   end;
  146.   PRARHeaderDataEx=^TRARHeaderDataEx;
  147.  
  148. var
  149.   DllLoaded:boolean=false;
  150.   RAROpenArchive:function(ArchiveData: PRARArchiveData): THandle; stdcall;
  151.   RAROpenArchiveEx:function(ArchiveData: PRARArchiveDataEx): THandle; stdcall;
  152.   RARCloseArchive:function(hArcData: THandle): integer; stdcall;
  153.   RARReadHeader:function(hArcData: THandle; HeaderData: PRARHeaderData): Integer; stdcall;
  154.   RARReadHeaderEx:function(hArcData: THandle; HeaderData: PRARHeaderDataEx): Integer; stdcall;
  155.   RARProcessFile:function(hArcData: THandle; Operation: Integer; DestPath, DestName: PAnsiChar): Integer; stdcall;
  156.   RARSetCallback:procedure(hArcData: THandle; Callback: TUnRarCallback; UserData: longint); stdcall;
  157.   RARSetChangeVolProc:procedure(hArcData: THandle; ChangeVolProc: TChangeVolProc); stdcall;
  158.   RARSetProcessDataProc:procedure(hArcData: THandle; ProcessDataProc: TProcessDataProc); stdcall;
  159.   RARSetPassword:procedure(hArcData: THandle; Password: PAnsiChar); stdcall;
  160.   RARGetDllVersion:function:Integer; stdcall;
  161.  
  162. function GetFileModifyDate(const FileName:string):TDateTime;
  163. function GetFileSize(const S:string):Int64;
  164. function isSFX(const FileName:String):boolean;
  165.  
  166. implementation
  167.  
  168. function GetFileModifyDate(const FileName:string):TDateTime;
  169. var
  170.   h:THandle;
  171.   Struct:TOFSTRUCT;
  172.   lastwrite:Integer;
  173. begin
  174.   Result:=0;
  175.   h:=OpenFile(PAnsiChar(FileName), Struct, OF_SHARE_DENY_NONE);
  176.   try
  177.     if h<>HFILE_ERROR then
  178.     begin
  179.       lastwrite:=FileGetDate(h);
  180.       Result:=FileDateToDateTime(lastwrite);
  181.     end;
  182.   finally
  183.     CloseHandle(h);
  184.   end;
  185. end;
  186.  
  187. function GetFileSize(const S:string):Int64;
  188. var
  189.   lFindData:TWin32FindDataA;
  190.   lHandle:Cardinal;
  191. begin
  192.   lHandle:=FindFirstFileA(PAnsiChar(S), lFindData);
  193.   if (lHandle<>INVALID_HANDLE_VALUE) then
  194.   begin
  195.     result:=lFindData.nFileSizeLow;
  196.     PCardinal(Cardinal(@result)+SizeOf(Cardinal))^:=lFindData.nFileSizeHigh;
  197.     windows.FindClose(lHandle);
  198.   end
  199.   else
  200.     result:=0;
  201. end;
  202.  
  203. function isSFX(const FileName:String):boolean;
  204. var
  205.   BinaryType:DWord;
  206. begin
  207.   if GetBinaryTypeA(PAnsiChar(FileName), BinaryType) then begin
  208.     if (BinaryType=SCS_32BIT_BINARY) or
  209.       (BinaryType=SCS_DOS_BINARY) or
  210.       (BinaryType=SCS_WOW_BINARY) or
  211.       (BinaryType=SCS_PIF_BINARY) or
  212.       (BinaryType=SCS_POSIX_BINARY) or
  213.       (BinaryType=SCS_OS216_BINARY)
  214.      then
  215.       Result:=True
  216.      else
  217.       Result:=False;
  218.   end else
  219.     Result:=False;
  220. end;
  221.  
  222. end.
  223.