alex f0d81ffd1c This commit was generated by cvs2svn to compensate for changes in r5402,
which included commits to RCS files with non-trunk default branches.

git-svn-id: svn://10.65.10.50/trunk@5403 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-10-20 15:51:36 +00:00

209 lines
8.8 KiB
Plaintext
Executable File

The code set out below is not intended to be compiled, but is only intended
as a very simplistic pointer to how to load and call the dll. You will have
to look in the files referenced below for actual, working code.
There are now five entry points to the dll.
There is a single "unzipping" entry point of:
windll_unzip(int argc, char **argv, DCL far*lpDCL,
USERFUNCTIONS far *lpUserFunc)
where the arguments are:
argc = number of file names being passed. If all files are to be
extracted, then this can be zero.
argv = file names to be unarchived. If all files are to be extracted,
then this can be null.
lpDCL = pointer to a structure with the flags for setting the
various options, as well as the zip file name.
lpUserFunc = pointer to a structure that contains pointers to functions
in the calling application, as well as sizes passed back to
the calling application etc. See below for a detailed description
of all the parameters
The DCL structure is shown below:
typedef struct {
int ExtractOnlyNewer; = true if you are to extract only newer
int Overwrite; = true if always overwrite files
int SpaceToUnderscore; = true if convert space to underscore
int PromptToOverwrite; = true if prompt to overwrite is wanted
int ncflag = write to stdout if true
int ntflag = test zip file
int nvflag = verbose listing
int nUflag = "update" (extract only newer/new files
int nzflag = display zip file comment
int ndflag = all args are files/dir to be extracted
int noflag = true if you are to over-write files, false if not
int naflag = do ASCII-EBCDIC and/or end of line translation
int fPrivilege = 1 => restore Acl's, 2 => Use privileges
LPSTR lpszZipFN = zip file name
} DCL, _far *LPDCL;
The typedef's for the function pointers in the structure USERFUNCTIONS
are shown immediately below.
typedef unsigned short ush;
typedef int (WINAPI DLLPRNT) (char * far, unsigned long);
typedef int (WINAPI DLLPASSWORD) (char *, int, const char *, const char *);
typedef void (WINAPI DLLSND) (void);
typedef int (WINAPI DLLREPLACE)(char *);
typedef void (WINAPI DLLMESSAGE)(unsigned long, unsigned long,
ush, ush, ush, ush, ush, ush, char, char *, char *, unsigned long, char);
Structure USERFUNCTIONS
typedef struct {
DLLPRNT *print; = a pointer to the application's print routine.
DLLSND *sound; = a pointer to the application's sound routine. This
can be NULL if your application doesn't use
sound.
DLLREPLACE *replace = a pointer to the application's replace routine.
DLLPASSWORD *password = a pointer to the application's password routine.
DLLMESSAGE *SendApplicationMessage = a pointer to the application's routine
for displaying information about specific files
in the archive. Used for listing the contents of
an archive.
WORD cchComment; = flag to be set if archive has a comment
unsigned long TotalSizeComp = value to be filled in by the dll for the
compressed total size of the archive. Note this
value does not include the size of the archive
header and central directory list.
unsigned long TotalSize = value to be filled in by the dll for the total
size of all files in the archive.
int CompFactor = value to be filled in by the dll for the overall
compression factor. This could actually be computed
from the other values, but it is available.
unsigned int NumMembers = total number of files in the archive.
} USERFUNCTIONS, far * LPUSERFUNCTIONS;
For examples of how the actual calls to the dll are set up in WiZ, look in
the files action.c and wizmain.c in the WiZ source directory. For a trival
example of how to load and call the dll, look in example.c and example.h.
For examples of how the actual loading and unloading of the dll's themselves
was done, look in wizmain.c in the WiZ source directory. Note that WiZ looks
specifically for a particular version number of the dll, and also expects to
find the company name to be Info-ZIP. This is to protect from getting
different versions of the dll loaded, with resulting unknown behavior.
There is also a second "single" entry point that was designed for use with
Visual Basic (and can possibly be used with Delphi also.) NOTE THAT THIS
ENTRY POINT HAS NOT BEEN ACTUALLY TESTED WITH VISUAL BASIC. It has been
tested with 'C', and works, but I do not have access to Visual Basic, and
am not a Visual Basic programmer. If you are trying to use this entry point
with Visual Basic, you are on your own. I have no idea how to call this
from Visual Basic.
int WINAPI unzipVB(int argc, char **argv, DCL far *lpDCL,
VBUSERFUNCTIONS far *lpUF)
where the arguments are:
argc = number of file names being passed
argv = file names to be unarchived
lpDCL = pointer to a structure with the flags for setting the
various options, as well as the zip file name.
lpUF = pointer to a structure that contains pointers to functions
in the calling application.
The DCL structure is shown above.
The VBUSERFUNCTION structure is as shown below:
typedef struct {
HINSTANCE hInstance; = The instance of the calling application.
char print[80]; = A string containing the name of the calling
application's print routine.
char sound[80]; = A string containing the name of the calling
application's sound routine.
char replace[80]; = A string containing the name of the calling
application's rename/replace routine.
char password[80]; = A string containing the name of the calling
application's password routine.
char SendApplicationMessage[80]; = A string containing the name of the calling
application's routine for displaying information
about specific files in the archive. Used for
listing the contents of an archive.
WORD cchComment; = flag to be set if archive has a comment
unsigned long TotalSizeComp = value to be filled in by the dll for the
compressed total size of the archive. Note this
value does not include the size of the archive
header and central directory list.
unsigned long TotalSize = value to be filled in by the dll for the total
size of all files in the archive.
int CompFactor = value to be filled in by the dll for the overall
compression factor. This could actually be computed
from the other values, but it is available.
unsigned int NumMembers = total number of files in the archive.
} VBUSERFUNCTIONS, far * LPVBUSERFUNCTIONS;
NOTE: The calling application must export (make available to the dll) the
routines for print, sound, replace and SendApplicationMessage.
There are four additional entry points:
UzpVersion:
UzpVer * UzpVersion(void);
where UzpVer is defined as:
typedef struct _UzpVer {
ulg structlen; /* length of the struct being passed */
ulg flag; /* bit 0: is_beta bit 1: uses_zlib */
char *betalevel; /* e.g., "g BETA" or "" */
char *date; /* e.g., "4 Sep 95" (beta) or "4 September 1995" */
char *zlib_version; /* e.g., "1.0.5" or NULL */
_version_type unzip;
_version_type zipinfo;
_version_type os2dll;
_version_type windll;
} UzpVer;
See api.c for exactly what UzpVersion does, but the short version of
what it does is return the unzip and dll versions in the UzpVer structure.
The remaining five functions are linked together. Their use would be as
follows (explanations of each function is shown further below):
#include "windll.h"
MyApiCallingRoutine()
{
CREATEGLOBALS();
.
.
.
Unz_Init(UzpGlobals, lpUserFunctions); /* Set up user functions */
.
.
.
Unz_SetOpts(UzpGlobals, lpDCL); /* Set up unzipping options */
.
.
.
Unz_Unzip(UzpGlobals, argc, argv); /* Unzip files */
.
.
.
DESTROYGLOBALS();
}
Each entry point is as defined below:
BOOL WINAPI Unz_Init(zvoid *, USERFUNCTIONS far *);
BOOL WINAPI Unz_SetOpts(zvoid *, LPDCL);
int WINAPI Unz_Unzip(zvoid *, int, char **);
Note that you should use either windll_unzip OR the series of calls
described above. Using both, depending on how you do it, could cause
problems.
Last revised May 30, 1997.
Mike White