AsphyreSQX.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:21k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit AsphyreSQX;
  2. //---------------------------------------------------------------------------
  3. // AsphyreSQX.pas                                       Modified: 15-Jan-2007
  4. // SQX Archive Interface                                          Version 1.0
  5. //---------------------------------------------------------------------------
  6. // The following code was written based on the existing SQX SDK 2.02
  7. // documentation dated 20-Apr-2006 and some constants have been taken fron
  8. // the headers generously provided by Do-wan Kim.
  9. //
  10. // The interfaced 'sqx20.dll' is developed by Sven Ritter as part of SQX
  11. // Archiver. The full SQX-SDK can be downloaded from:
  12. //     http://www.sqx-archiver.org/
  13. //---------------------------------------------------------------------------
  14. // Important Notice:
  15. //
  16. // If you modify/use this code or one of its parts either in original or
  17. // modified form, you must comply with Mozilla Public License v1.1,
  18. // specifically section 3, "Distribution Obligations". Failure to do so will
  19. // result in the license breach, which will be resolved in the court.
  20. // Remember that violating author's rights is considered a serious crime in
  21. // many countries. Thank you!
  22. //
  23. // !! Please *read* Mozilla Public License 1.1 document located at:
  24. //  http://www.mozilla.org/MPL/
  25. //
  26. // If you require any clarifications about the license, feel free to contact
  27. // us or post your question on our forums at: http://www.afterwarp.net
  28. //---------------------------------------------------------------------------
  29. // The contents of this file are subject to the Mozilla Public License
  30. // Version 1.1 (the "License"); you may not use this file except in
  31. // compliance with the License. You may obtain a copy of the License at
  32. // http://www.mozilla.org/MPL/
  33. //
  34. // Software distributed under the License is distributed on an "AS IS"
  35. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  36. // License for the specific language governing rights and limitations
  37. // under the License.
  38. //
  39. // The Original Code is AsphyreSQX.pas.
  40. //
  41. // The Initial Developer of the Original Code is M. Sc. Yuriy Kotsarenko.
  42. // Portions created by M. Sc. Yuriy Kotsarenko are Copyright (C) 2007,
  43. // Afterwarp Interactive. All Rights Reserved.
  44. //---------------------------------------------------------------------------
  45. interface
  46. //---------------------------------------------------------------------------
  47. uses
  48.  Windows;
  49. //---------------------------------------------------------------------------
  50. const
  51.  // The path and full name of SQX DLL. Can be modified to be loaded from a
  52.  // specific folder relative to current path.
  53.  SQX_DLL_NAME = 'sqx20.dll';
  54. //---------------------------------------------------------------------------
  55. // The possible values returned by SQX callback mechanism.
  56. //---------------------------------------------------------------------------
  57.  SQX_PROGRESS_CANCEL   = 0; // The current operation will be cancelled.
  58.  SQX_PROGRESS_OK    = 1; // Going on with the current operation.
  59.  SQX_REPLACE_OVERWRITE = 0; // The specified file will be overwritten.
  60.  SQX_REPLACE_SKIP      = 1; // The specified file will not be overwritten.
  61.  SQX_REPLACE_CANCEL    = 2; // The current operation will be cancelled.
  62.  SQX_PASSWORD_CANCEL   = 0; // The current operation will be cancelled.
  63.  SQX_PASSWORD_OK       = 1; // Going on with the new password.
  64.  SQX_SKIPFILE_SKIP     = 1; // The specified file will be skipped.
  65.  SQX_SKIPFILE_CANCEL   = 2; // The current operation will be cancelled.
  66.  SQX_NEXTDISK_CANCEL   = 0; // The current operation will be cancelled.
  67.  SQX_NEXTDISK_OK       = 1; // Going on with the new folder to the next volume.
  68. //---------------------------------------------------------------------------
  69. // Values specifying the type of a callback.
  70. //---------------------------------------------------------------------------
  71.  SQX_CALLBACK_FILENAME        = 0; // SQX archiver is about to compress, extract, delete or test a file.
  72.  SQX_CALLBACK_PROGRESS        = 1; // SQX archiver signals the progress of a file beeing compressed, extracted or tested.
  73.  SQX_CALLBACK_REPLACE         = 2; // SQX archiver is about to overwrite either a file on disk (when extracting) or a file in the archive (when compressing).
  74.  SQX_CALLBACK_PASSWORD        = 3; // SQX archiver needs a password to decrypt a file.
  75.  SQX_CALLBACK_PASSWORD_HEADER = 4; // SQX archiver needs a password to decrypt the archive directory.
  76.  SQX_CALLBACK_SKIP            = 5; // SQX archiver cannot open a file because it is locked by another application.
  77.  SQX_CALLBACK_NEXTDISK        = 6; // SQX archiver needs the next volume when extracting or a new disk when compressing.
  78.  SQX_CALLBACK_SIGNAL          = 7; // SQX archiver signals the next command.
  79. //---------------------------------------------------------------------------
  80. // The possible error codes returned by SQX functions.
  81. //---------------------------------------------------------------------------
  82.  SQX_ERR_SUCCESS                       = 0;  // No error.
  83.  SQX_ERR_ERROR                         = 1;  // Unknown error in the last archive operation.
  84.  SQX_ERR_FILE_NOT_FOUND                = 2;  // The system cannot find the file specified.
  85.  SQX_ERR_PATH_NOT_FOUND                = 3;  // The system cannot find the path specified.
  86.  SQX_ERR_TOO_MANY_FILES                = 4;  // The system cannot open the file.
  87.  SQX_ERR_ACCESS_DENIED                 = 5;  // Access is denied.
  88.  SQX_ERR_INVALID_HANDLE                = 6;  // The file handle is invalid.
  89.  SQX_ERR_DISK_FULL                     = 7;  // The disk is full.
  90.  SQX_ERR_OUT_OF_MEMORY                 = 8;  // Not enough memory is available to complete this operation.
  91.  SQX_ERR_CANT_ACCESS_TEMP_DIR          = 9;  // Cannot access temp folder during a delete or update operation on a solid archive.
  92.  SQX_ERR_TEMP_DIR_FULL                 = 10; // Not enough space on drive for the temporary folder.
  93.  SQX_ERR_USER_ABORT                    = 11; // Cancelled by user.
  94.  SQX_ERR_INVALID_ARC_HANDLE            = 12; // Invalid archive handle.
  95.  SQX_ERR_CANT_FIND_LANG_DATA           = 13; // Could not find the selected language file for self-extracting archives.
  96.  SQX_ERR_UNKNOWN_SUBSTREAM             = 14; // The archive contains at least one unknown alternate data stream.
  97.  SQX_ERR_BAD_SUBSTREAM_CRC             = 15; // Bad alternate stream CRC. Archive is probably corrupted.
  98.  SQX_ERR_UNKNOWN_METHOD                = 16; // This method of compression is not supported by the archiver.
  99.  SQX_ERR_FILE_ENCRYPTED                = 17; // Archive is encrypted with a password.
  100.  SQX_ERR_BAD_CRC                       = 18; // Bad CRC. Archive is probably corrupted.
  101.  SQX_ERR_CANT_CREATE_FILE              = 19; // Could not create file or folder.
  102.  SQX_ERR_BAD_FILE_FORMAT               = 20; // Bad archive file format.
  103.  SQX_ERR_FUNCTION_NOT_SUPPORTED        = 21; // Function is not supported.
  104.  SQX_ERR_FUNC_NOT_SUPPORTED_BY_ARCHIVE = 22; // Function is not supported for this archive type.
  105.  SQX_ERR_CANT_CREATE_ARC_DIR           = 23; // Could not create folder in archive. It already exists a folder with this name.
  106.  SQX_ERR_INVALID_DIR_NAME              = 24; // Could not create folder in archive. The folder name contains invalid characters.
  107.  SQX_ERR_INVALID_FILE_NAME             = 25; // Could not create file in archive. The file name contains invalid characters.
  108.  SQX_ERR_TOO_MANY_BROKEN_FBLOCKS       = 26; // The archive file contains too many damaged file blocks and cannot be repaired.
  109.  SQX_ERR_ARCHIVE_OK_RDATA_NOT          = 27; // It seems that the archive has no errors, but the recovery data does not match the archive. Maybe this archive was edited by a program that could not identify the recovery data.
  110.  SQX_ERR_RDATA_DAMAGED                 = 28; // The recovery data of the archive file is damaged, too. This archive file cannot be repaired.
  111.  SQX_ERR_RDATA_NEW_VERSION             = 29; // The archive contains recovery data that cannot be used with this version of our software. The newest versions of our software are always available at http://www.speedproject.de/.
  112.  SQX_ERR_RDATA_DOES_NOT_MATCH          = 30; // The recovery data does not match the archive. It seems that this archive was edited by a program that could not identify the recovery data.
  113.  SQX_ERR_CANT_FIND_RDATA               = 31; // It seems that the archive does not contain any recovery data.
  114.  SQX_ERR_ARCHIVE_IS_LOCKED             = 32; // Cannot modify locked archive.
  115.  SQX_ERR_CANT_ADD_TO_MV                = 33; // It is not possible to add files to a multi-volume archive.
  116.  SQX_ERR_CANT_DELETE_FROM_MV           = 34; // It is not possible to delete files from a multi-volume archive.
  117.  SQX_ERR_NEED_1ST_VOLUME               = 35; // This file is part of a multi-volume archive. The first volume of the archive is needed to open it. Please select the first volume to open the archive.
  118.  SQX_ERR_MISSING_VOLUME                = 36; // The last volume of the archive could not be found.
  119.  SQX_ERR_VOLUME_LIMIT_REACHED          = 37; // Cannot create more than 999 volumes.
  120.  SQX_ERR_SFXSTUB_NOT_INSTALLED         = 38; // This system lacks the support for the SFX type you have selected. Please visit the download section of http://ww.speedproject.de/ to obtain complete support for SFX archives.
  121.  SQX_ERR_BACKUP_READ_ACCESS_DENIED     = 39; // Read access to alternate data stream was denied. Only the file itself is being compressed.
  122.  SQX_ERR_BACKUP_WRITE_ACCESS_DENIED    = 40; // Could not write alternate data stream (e.g. file comments).
  123.  SQX_ERR_ACL_READ_ACCESS_DENIED        = 41; // Could not read security attributes. Only the file itself is being compressed.
  124.  SQX_ERR_ACL_WRITE_ACCESS_DENIED       = 42; // Could not write security attributes.
  125.  SQX_ERR_WRONG_ARCHIVER_VERSION        = 43; // This archive contains data created with a higher version of this software. Please download the lastest update of the software from http://www.speedproject.de/.
  126.  SQX_ERR_CANT_COPY_SOURCE_TO_SOURCE    = 44; // Cannot copy an archive to itself. Please choose a different target name.
  127.  SQX_ERR_VOLUMES_TOO_SMALL             = 45; // The volume size cannot be smaller than 130 kByte.
  128.  SQX_ERR_ARCHIVE_VERSION_TOO_HIGH      = 46; // This archive can only be extracted. It is not possible to add files.
  129.  SQX_ERR_EXT_RDATA_DOES_NOT_MATCH      = 47; // The external recovery data don't seem to belong to the selected archive.
  130.  SQX_ERR_BAD_PARAMETER                 = 48; // The parameter is incorrect.
  131.  SQX_ERR_EQUAL_PASSWORDS               = 49; // The passwords for the archive files and archive directory are identical. Please enter different passwords.
  132.  SQX_ERR_REQUIRES_ENCRYPTION           = 50; // You cannot encrypt the archive directory without encrypting the files. Please enter one password for the archive directory and another password for the files.
  133.  SQX_ERR_MISSING_HEADER_PASSWORD       = 51; // Please enter a password to encrypt the archive directory.
  134.  SQX_ERR_MISSING_SQX_PRIVATE_KEY       = 52; // Could not find/access the private key required to encrypt the archive. Please make sure that the software can access all the keys in question.
  135.  SQX_ERR_MISSING_SQX_AVKEY             = 53; // Could not find the key required to create a digital signature. Please make sure that the software can access the authentication key.
  136.  SQX_ERR_MISSING_EXTERNAL_AVKEY        = 54; // Could not find/access the external key necessary to sign the archive. Please make sure that the software can access all keys in question.
  137.  SQX_ERR_INVALID_SQX_AVKEY             = 55; // The key you have selected to create digital signatures is invalid.
  138.  SQX_ERR_SQX_AVKEY_VERSION             = 56; // This version of the software cannot use the existing key to create digital signatures. Please download the lastest update of the software from http://www.speedproject.de/.
  139.  SQX_ERR_SQX_AVDATA_VERSION            = 57; // This version of the software cannot process the digital signature embedded within the archive. Please download the lastest update of the software from http://www.speedproject.de/.
  140.  SQX_ERR_SQX_BROKEN_AVRECORD           = 58; // The archive contains an invalid digital signature. The archive is either damaged or it has been manipulated.
  141.  SQX_ERR_RIJNDAEL_RSA                  = 59; // Unexpected error in an encryption function. Please contact our product support.
  142.  SQX_ERR_REQUIRES_NTFS                 = 60; // An option you selected requires NTFS.
  143.  SQX_ERR_REQUIRES_WINNT                = 61; // An option you selected requires Windows NT.
  144.  SQX_ERR_REQUIRES_W2K                  = 62; // An option you selected requires Windows 2000.
  145.  SQX_ERR_REQUIRES_WINXP                = 63; // An option you selected requires Windows XP.
  146.  SQX_ERR_REQUIRES_WINXP_SP1            = 64; // An option you selected requires Windows XP SP1.
  147.  SQX_ERR_REQUIRES_WINXP_SP2            = 65; // An option you selected requires Windows XP SP2.
  148.  SQX_ERR_REQUIRES_LONGHORN             = 66; // An option you selected requires Longhorn.
  149.  SQX_ERR_NO_RESOURCES_FOUND            = 67; // The selected SFX stub does not contain resources. Can not modify SFX stub.
  150.  SQX_ERR_UNKNOWN_ICON_FORMAT           = 68; // Could not determine the format of the selected icon file.
  151.  SQX_ERR_NO_MATCHING_ICON_SIZE         = 69; // The selected SFX stub does not contain icons with valid sizes. Can not modify SFX stub.
  152.  SQX_ERR_UNKNOWN_EXE_FORMAT            = 70; // The format of the selected SFX stub is unknown.
  153.  SQX_ERR_REQUIRES_SOURCE_PATH          = 71; // The extended archive test requires the source path.
  154.  SQX_ERR_FILE_DATA_NOT_EQUAL           = 72; // Extended archive test: The source on hard disk is different from the file in the archive.
  155.  SQX_ERR_COMMENT_BIGGER_4K             = 73; // You cannot add to the archive comments longer than 4096 chars. Please shorten your comments and try again.
  156.  SQX_ERR_CANT_CREATE_SFX_FROM_MV       = 74; // Cannot create a self-extracting archive from a multi-volume archive.
  157. //---------------------------------------------------------------------------
  158. type
  159.  TSqxString = packed array[0..MAX_PATH - 1] of Char;
  160. //---------------------------------------------------------------------------
  161.  TSqxCallbackInfo = packed record
  162.   CallbackType   : Longword;
  163.   SourceFileName : PChar;
  164.   TargetFileName : PChar;
  165.   Progress       : Integer;
  166.   FindDataExist  : PWin32FindData;
  167.   FindDataReplace: PWin32FindData;
  168.   CryptKey       : TSqxString;
  169.   OldCryptKey    : TSqxString;
  170.   CryptFileName  : TSqxString;
  171.   TotalSize      : Longword;
  172.   DiskNum        : Longword;
  173.   NextDiskPath   : TSqxString;
  174.   Signal         : Longword;
  175.   BlockSize      : Int64;
  176.  end;
  177. //---------------------------------------------------------------------------
  178.  TSqxCallback = function(Param: Pointer;
  179.   var CallbackInfo: TSqxCallbackInfo): Integer; stdcall;
  180. //---------------------------------------------------------------------------
  181.  TSqxAvInfo = packed record
  182.   AVInfoPresent: Boolean;
  183.   AV_ID        : TSqxString;
  184.   CreationTime : Int64;
  185. end;
  186. //---------------------------------------------------------------------------
  187.  TSqxArcInfo = packed record
  188.   Size             : Longword;
  189.   FileFormat       : Longword;
  190.   ArcerMajorVersion: Longword;
  191.   ArcerMinorVersion: Longword;
  192.   DictionarySize   : Longword;
  193.   RecoveryData     : LongBool;
  194.   Encryption       : Longword;
  195.   Solid            : LongBool;
  196.   HostOS           : Longword;
  197.   TotalFiles       : Longword;
  198.   CompressedSize   : Int64;
  199.   UncompressedSize : Int64;
  200.   Ratio            : Integer;
  201.   HeaderEncrypted  : LongBool;
  202.   IsMultiVolume    : LongBool;
  203.   ArchiveComment   : LongBool;
  204.   FileComments     : LongBool;
  205.   AvInfo           : TSqxAvInfo;
  206. end;
  207. //---------------------------------------------------------------------------
  208.  TSqxFileTime = packed record
  209.   BlockPresent  : Boolean;
  210.   CreationTime  : Int64;
  211.   LastAccessTime: Int64;
  212.   LastWriteTime : Int64;
  213. end;
  214. //---------------------------------------------------------------------------
  215.  PSqxArcNode = ^TSqxArcNode;
  216.  TSqxArcNode = packed record
  217.   FileName      : PChar;
  218.   FileNameLen   : Longword;
  219.   ExtraName     : PChar;
  220.   ExtraNameLen  : Longword;
  221.   FileNameType  : Longword;
  222.   Size          : Int64;
  223.   SizeOrig      : Int64;
  224.   DosFileTime   : Longword;
  225.   Attributes    : Longword;
  226.   ArcerVersion  : Longword;
  227.   FileCRC       : Longword;
  228.   HostOS        : Longword;
  229.   Method        : Longword;
  230.   CommentLen    : Longword;
  231.   Comment       : PChar;
  232.   Encrypted     : LongBool;
  233.   Tagged        : LongBool;
  234.   MappedMethod  : Longword;
  235.   ExtendedError : Longword;
  236.   FileTime      : TSqxFileTime;
  237. end;
  238. //---------------------------------------------------------------------------
  239.  PSqxArcListNode = ^TSqxArcListNode;
  240.  TSqxArcListNode = packed record
  241.   Next   : PSqxArcListNode;
  242.   ArcNode: PSqxArcNode;
  243.  end;
  244. //---------------------------------------------------------------------------
  245.  PSqxArcList = ^TSqxArcList;
  246.  TSqxArcList = packed record
  247.   ItemCount: Longword;
  248.   Head     : PSqxArcListNode;
  249.   Tail     : PSqxArcListNode;
  250.  end;
  251. //---------------------------------------------------------------------------
  252.  TSqxExtractOptions = packed record
  253.   Size                      : Longword;
  254.   Password                  : TSqxString;
  255.   PasswordHeader            : TSqxString;
  256.   TempDir                   : TSqxString;
  257.   RelativePath              : TSqxString;
  258.   OutputPath                : TSqxString;
  259.   ResetArchiveAttribute     : LongBool;
  260.   OverwriteAlways           : LongBool;
  261.   KeepBrokenFiles           : LongBool;
  262.   CreateFolders             : LongBool;
  263.   RestoreACLs               : LongBool;
  264.   RestoreStreams            : LongBool;
  265.   RestoreUnicodeNames       : LongBool;
  266.   RestoreWin32FileTimes     : LongBool;
  267.   RestoreDirectoryTimeStamps: LongBool;
  268.   AutoRestoreComments       : LongBool;
  269.   SetZoneID                 : LongBool;
  270. end;
  271. //---------------------------------------------------------------------------
  272. // Initializes an application's use of the SQX archiver functions and creates
  273. // an archiver handle.
  274. //---------------------------------------------------------------------------
  275. function SqxInitArchive(ArchiveName: PChar; Callback: TSqxCallback;
  276.  Param: Pointer; var Archive: THandle): Integer; stdcall;
  277.  external SQX_DLL_NAME;
  278. //---------------------------------------------------------------------------
  279. // Closes a SQX archive handle.
  280. //---------------------------------------------------------------------------
  281. procedure SqxDoneArchive(Archive: THandle); stdcall; external SQX_DLL_NAME;
  282. //---------------------------------------------------------------------------
  283. // Creates a file list that is used to pass a list of file names to SQX
  284. // archiver when creating, extracting or manipulating SQX archives.
  285. //---------------------------------------------------------------------------
  286. function SqxInitFileList(Archive: THandle): THandle; stdcall;
  287.  external SQX_DLL_NAME;
  288. //---------------------------------------------------------------------------
  289. // Destroys a file list created with the SqxInitFileList function.
  290. //---------------------------------------------------------------------------
  291. procedure SqxDoneFileList(Archive: THandle; FileMaskList: THandle); stdcall;
  292.  external SQX_DLL_NAME;
  293. //---------------------------------------------------------------------------
  294. // Adds a file name to a file list.
  295. //---------------------------------------------------------------------------
  296. procedure SqxAppendFileList(Archive: THandle; FileMaskList: THandle;
  297.  FileName: PChar); stdcall; external SQX_DLL_NAME;
  298. //---------------------------------------------------------------------------
  299. // Creates a file list that is used to pass a list of file names and file
  300. // properties to the caller when listing SQX archives with the SqxListFiles
  301. // function.
  302. //---------------------------------------------------------------------------
  303. function SqxInitArcFileList(Archive: THandle): PSqxArcList; stdcall;
  304.  external SQX_DLL_NAME;
  305. //---------------------------------------------------------------------------
  306. // Destroys a file list created with the SqxInitArcFileList function.
  307. //---------------------------------------------------------------------------
  308. procedure SqxDoneArcFileList(Archive: THandle; ArcFileList: PSqxArcList);
  309.  stdcall; external SQX_DLL_NAME;
  310. //---------------------------------------------------------------------------
  311. // List the contents of an archive.
  312. //---------------------------------------------------------------------------
  313. function SqxListFiles(Archive: THandle; FileMaskList: THandle;
  314.  ArcFileList: PSqxArcList; var ArchiveInfo: TSqxArcInfo): Integer; stdcall;
  315.  external SQX_DLL_NAME;
  316. //---------------------------------------------------------------------------
  317. // Extracts one or more files from an archive.
  318. //---------------------------------------------------------------------------
  319. function SqxExtractFiles(Archive: THandle; Callback: TSqxCallback;
  320.  Param: Pointer; FileMaskList: THandle;
  321.  var ExtractOptions: TSqxExtractOptions): Integer; stdcall;
  322.  external SQX_DLL_NAME;
  323. //---------------------------------------------------------------------------
  324. implementation
  325. //---------------------------------------------------------------------------
  326. end.