unit kunzip;

interface

uses Windows;

const
  kunzipdll = 'kunzip.dll';

var
  kunzip_inflate_init: function: integer; cdecl;
  kunzip_inflate_free: function: integer; cdecl;
  kunzip_all: function(zip_filename, base_dir: PChar): integer; cdecl;
  kunzip_next: function(zip_filename, base_dir: PChar; offset: integer): integer; cdecl;
  kunzip_count_files: function(zip_filename: PChar): integer; cdecl;
  kunzip_get_offset_by_number: function(zip_filename: PChar;
    file_count: integer): integer; cdecl;
  kunzip_get_offset_by_name: function(zip_filename, compressed_filename: PChar;
    match_flags, skip_offset: integer): integer; cdecl;
  kunzip_get_name: function(zip_filename, name: PChar; offset: integer): integer; cdecl;
  kunzip_get_filesize: function(zip_filename: PChar; offset: integer): integer; cdecl;
  kunzip_get_modtime: function(zip_filename: PChar; offset: integer): integer; cdecl;
  kunzip_print_version: function: integer; cdecl;
  kunzip_get_version: function(version_string: PChar): integer; cdecl;

function load_kunzip(const FileName: WideString): THandle;
procedure unload_kunzip(Handle: THandle);

implementation

function load_kunzip(const FileName: WideString): THandle;
var
  OldMode: integer;
begin
  OldMode := SetErrorMode($8001);
  result := LoadLibraryW(PWideChar(FileName));
  SetErrorMode(OldMode);
  if result <> 0 then
  begin
    @kunzip_inflate_init := GetProcAddress(result, PChar('kunzip_inflate_init'));
    @kunzip_inflate_free := GetProcAddress(result, PChar('kunzip_inflate_free'));
    @kunzip_all := GetProcAddress(result, PChar('kunzip_all'));
    @kunzip_next := GetProcAddress(result, PChar('kunzip_next'));
    @kunzip_count_files := GetProcAddress(result, PChar('kunzip_count_files'));
    @kunzip_get_offset_by_number := GetProcAddress(result, PChar('kunzip_get_offset_by_number'));
    @kunzip_get_offset_by_name := GetProcAddress(result, PChar('kunzip_get_offset_by_name'));
    @kunzip_get_name := GetProcAddress(result, PChar('kunzip_get_name'));
    @kunzip_get_filesize := GetProcAddress(result, PChar('kunzip_get_filesize'));
    @kunzip_get_modtime := GetProcAddress(result, PChar('kunzip_get_modtime'));
    @kunzip_print_version := GetProcAddress(result, PChar('kunzip_print_version'));
    @kunzip_get_version := GetProcAddress(result, PChar('kunzip_get_version'));

    if(@kunzip_inflate_init = nil) or
      (@kunzip_inflate_free = nil) or
      (@kunzip_all = nil) or
      (@kunzip_next = nil) or
      (@kunzip_count_files = nil) or
      (@kunzip_get_offset_by_number = nil) or
      (@kunzip_get_offset_by_name = nil) or
      (@kunzip_get_name = nil) or
      (@kunzip_get_filesize = nil) or
      (@kunzip_get_modtime = nil) or
      (@kunzip_print_version = nil) or
      (@kunzip_get_version = nil)
    then begin
      FreeLibrary(result);
      result := 0;
    end;
  end;
end;

procedure unload_kunzip(Handle: THandle);
begin
  if Handle <> 0 then
    FreeLibrary(Handle);
  Handle := 0;
end;

end.
