wizmain.c
上传用户:jlteech
上传日期:2007-01-06
资源大小:349k
文件大小:25k
源码类别:

压缩解压

开发平台:

Visual C++

  1. /****************************************************************************
  2.     PURPOSE:  Windows Info-ZIP
  3.     FUNCTIONS:
  4.         WinMain() - calls initialization function, processes message loop
  5.         WiZInit() - initializes window data and registers window
  6.         WiZMainWndProc() - processes messages
  7.         About() - processes messages for "About" dialog box
  8.     AUTHOR: Robert A. Heath,  157 Chartwell Rd. Columbia, SC 29210
  9.     I place this source module, WizUnZip.c, in the public domain.  Use it as
  10.     you will.
  11.  Modifications: M. White - 1995, 1996
  12. - Ported to Borland C
  13. - Ported to WinNT and Win95
  14. - Added dll functionality
  15. - Added zip functionality
  16. - renamed to wizmain.c
  17. - extensively modified for WiZ
  18. ****************************************************************************/
  19. #include <sys/types.h>
  20. #include <sys/stat.h>
  21. #include <time.h>
  22. #include <string.h>
  23. #include "wiz.h"
  24. #include "wizver.h"
  25. #ifdef WIN32
  26. #include <winver.h>
  27. #else
  28. #include <dir.h>
  29. #include <ver.h>
  30. #endif
  31. #ifdef WIN32
  32. #define UNZ_DLL_NAME "UNZIP32.DLL"
  33. #define ZIP_DLL_NAME "ZIP32.DLL"
  34. #else
  35. #define UNZ_DLL_NAME "UNZIP16.DLL"
  36. #define ZIP_DLL_NAME "ZIP16.DLL"
  37. #  ifndef TEXT
  38. #    define TEXT(x) x
  39. #  endif
  40. #endif
  41. static char __based(__segname("STRINGS_TEXT")) szFirstUse[] = "FirstUse"; /* first use keyword in WiZ.INI */
  42. char __based(__segname("STRINGS_TEXT")) szDefaultUnzipToDir[] = "DefaultUnzipToDir";
  43. char __based(__segname("STRINGS_TEXT")) szDefaultUnzipFromDir[] = "DefaultUnzipFromDir";
  44. char __based(__segname("STRINGS_TEXT")) szLBSelectionKey[] = "LBSelection"; /* LBSelection keyword in WiZ.INI */
  45. char __based(__segname("STRINGS_TEXT")) szHideStatus[] = "HideStatusWindow";
  46. char __based(__segname("STRINGS_TEXT")) szWiZIniFile[] = "WIZ.INI";
  47. char __based(__segname("STRINGS_TEXT")) szZipOptionKey[] = "ZipOptions";
  48. char __based(__segname("STRINGS_TEXT")) szZipToDirKey[] = "ZipToDir";
  49. /* File and Path Name variables */
  50. char __based(__segname("STRINGS_TEXT")) szAppName[] = "WiZ";       /* application title        */
  51. char __based(__segname("STRINGS_TEXT")) szStatusClass[] = "MsgWndw";/* status window class  */
  52. char __based(__segname("STRINGS_TEXT")) szUnzipToDirName[PATH_MAX];    /* extraction ("windll_unzip to") directory name in ANSI */
  53. /* Note that szHelpFileName will be expanded to a fully qualified path
  54.    and file name when we go search for the help file.
  55.  */
  56. #ifdef WIN32
  57. char szHelpFileName[PATH_MAX] = "WIZ32.HLP";
  58. #else
  59. char szHelpFileName[PATH_MAX] = "WIZ16.HLP";
  60. #endif
  61. #define DLL_WARNING "Cannot find %s."
  62.             " The Dll must be in the application directory, the path, "
  63.             "the Windows directory or the Windows System directory."
  64. #define DLL_VERSION_WARNING "%s has the wrong version number."
  65.             " Insure that you have the correct dll's installed, and that "
  66.             "an older dll is not in your path or Windows System directory."
  67. #ifdef WIN32
  68. extern HWND hSplashScreen;
  69. void ShowSplashScreen(void);
  70. #endif
  71. HANDLE hInst;               /* current instance */
  72. HMENU  hMenu;               /* main menu handle */
  73. HANDLE hAccTable;
  74. HANDLE hHourGlass;          /* handle to hourglass cursor */
  75. HANDLE hSaveCursor;         /* current cursor handle */
  76. HANDLE hHelpCursor;         /* help cursor */
  77. HANDLE hFixedFont;          /* handle to fixed font */
  78. HANDLE hOldFont;            /* handle to old font */
  79. int hFile;              /* file handle */
  80. HWND hWndMain;          /* the main window handle. */
  81. HWND hWndList;          /* list box handle */
  82. HWND hWndEdit;        /* status   (a.k.a. Messages) window */
  83. HWND hWndStatic;
  84. HWND hExtract;          /* extract button */
  85. HWND hDisplay;          /*display button */
  86. HWND hTest;             /* test button */
  87. HWND hZipInfo;          /* Zip Info button */
  88. HWND hShowComment;      /* show comment button */
  89. HWND hHelp;   /* help button */
  90. HWND hOpen;   /* open button */
  91. HWND hArchive; /* create archive button */
  92. HWND hDeleteArchive; /* delete button */
  93. HWND hCopyArchive;   /* copy archive button */
  94. HWND hMoveArchive;   /* move archive button */
  95. HWND hRenameArchive; /* rename archive button */
  96. HWND hExit;
  97. HWND hMakeDir;
  98. HWND hSelectAll;
  99. HWND hDeselectAll;
  100. HWND hSelectPattern;
  101. HWND hClearStatus;
  102. HWND hUnzipToDir;
  103. HWND hStatusButton;
  104. HWND hListBoxButton;
  105. int fLB_Selection;
  106. UF  uf;
  107. WPARAM wLBSelection = IDM_LB_DISPLAY; /* default listbox selection action */
  108. HBRUSH hBrush ;         /* brush for  standard window backgrounds  */
  109. LPUMB lpumb;
  110. LPUSERFUNCTIONS lpUserFunctions;
  111. LPZIPUSERFUNCTIONS lpZipUserFunctions;
  112. HANDLE hUF       = (HANDLE)NULL;
  113. LPDCL lpDCL      = NULL;
  114. HANDLE hZUF      = (HANDLE)NULL;
  115. HANDLE hDCL      = (HANDLE)NULL;
  116. ZCL ZpZCL;
  117. ZPOPT ZpOpt;
  118. #ifdef WIN32
  119. HWND       hRTF;
  120. HANDLE  hRTFLib  = (HANDLE)NULL;
  121. DWORD dwPlatformId = 0xFFFFFFFF;
  122. #endif
  123. HINSTANCE hZipDll;
  124. HINSTANCE hUnzipDll;
  125. HANDLE  hStrings = (HANDLE)NULL;
  126. HANDLE  hEditor = (HANDLE)NULL;
  127. int ofretval;       /* return value from initial open if filename given */
  128. WORD cZippedFiles;      /* total personal records in file   */
  129. WORD cListBoxLines; /* max list box lines showing on screen */
  130. WORD cLinesMessageWin; /* max visible lines on message window  */
  131. /* Forward References */
  132. #ifndef USE_UNZIP_LIB
  133. _DLL_UNZVAL Unz_Validate;
  134. _DLL_UNZIP Unz_SingleEntryPoint;
  135. _USER_FUNCTIONS UzInit;
  136. #endif
  137. #ifndef USE_ZIP_LIB
  138. _ZIP_USER_FUNCTIONS ZipInit;
  139. _DLL_ZIP ZipArchive;
  140. ZIPSETOPTIONS ZipSetOptions;
  141. ZIPGETOPTIONS ZipGetOptions;
  142. #endif
  143. void FreeUpMemory(void);
  144. #ifdef WIN32
  145. BOOL IsNT(VOID);
  146. #endif
  147. int WINAPI WinMain(HANDLE, HANDLE, LPSTR, int);
  148. long WINAPI WiZMainWndProc(HWND, WORD, WPARAM, LPARAM);
  149. /****************************************************************************
  150.     FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
  151.     PURPOSE: calls initialization function, processes message loop
  152.     COMMENTS:
  153.         This will initialize the window class if it is the first time this
  154.         application is run.  It then creates the window, and processes the
  155.         message loop until a WM_QUIT message is received.  It exits the
  156.         application by returning the value passed by the PostQuitMessage.
  157. ****************************************************************************/
  158. #ifdef __BORLANDC__
  159. #  ifdef WIN32
  160. #pragma argsused
  161. #  endif
  162. #endif
  163. int WINAPI WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow)
  164. HANDLE hInstance;         /* current instance             */
  165. HANDLE hPrevInstance;     /* previous instance            */
  166. LPSTR lpCmdLine;          /* command line                 */
  167. int nCmdShow;             /* show-window type (open/icon) */
  168. {
  169. #ifdef WIN32
  170. char *ptr;
  171. DWORD second;   /* Used for timing the splash screen */
  172. #if (!defined(USE_UNZIP_LIB) && !defined(USE_ZIP_LIB))
  173. DWORD dwVerInfoSize;
  174. DWORD dwVerHnd;
  175. HANDLE  hMem;         /* handle to mem alloc'ed */
  176. #endif
  177. #else
  178. HFILE hfile;
  179. OFSTRUCT ofs;
  180. #endif
  181. char szFullPath[PATH_MAX];
  182. int i;
  183. BOOL fFirstUse;           /* first use if TRUE         */
  184. #ifndef WIN32
  185. if (!hPrevInstance)       /* Has application been initialized? */
  186. #endif
  187.    if (!WiZInit(hInstance))
  188.       return 0;           /* Exits if unable to initialize     */
  189. #ifdef WIN32
  190.       InitCommonControls();
  191. if (!hRTFLib)
  192.    hRTFLib = LoadLibrary("RICHED32.DLL");
  193. if (!hRTFLib)
  194.     {
  195.     char szErr[255];
  196.     wsprintf(szErr, "LoadLibrary Failed. Error Code %ld", GetLastError());
  197.     MessageBox(NULL, szErr, szAppName, MB_OK );
  198.     return 0;
  199.     }
  200. IsNT(); /* Are we running on NT? */
  201. #endif
  202. hStrings = GlobalAlloc( GPTR, (DWORD)sizeof(UMB));
  203. if ( !hStrings )
  204.    {
  205. #ifdef WIN32
  206.    FreeLibrary(hRTFLib);
  207. #endif
  208.    return 0;
  209.    }
  210. lpumb = (LPUMB)GlobalLock( hStrings );
  211. if ( !lpumb )
  212.    {
  213.    GlobalFree( hStrings );
  214. #ifdef WIN32
  215.    FreeLibrary(hRTFLib);
  216. #endif
  217.    return 0;
  218.    }
  219. hDCL = GlobalAlloc( GPTR, (DWORD)sizeof(DCL));
  220. if (!hDCL)
  221.    {
  222.    FreeUpMemory();
  223. #ifdef WIN32
  224.    FreeLibrary(hRTFLib);
  225. #endif
  226.    return 0;
  227.    }
  228. lpDCL = (LPDCL)GlobalLock(hDCL);
  229. if (!lpDCL)
  230.    {
  231.    FreeUpMemory();
  232. #ifdef WIN32
  233.    FreeLibrary(hRTFLib);
  234. #endif
  235.    return 0;
  236.    }
  237. hUF = GlobalAlloc( GPTR, (DWORD)sizeof(USERFUNCTIONS));
  238. if (!hUF)
  239.    {
  240.    FreeUpMemory();
  241. #ifdef WIN32
  242.    FreeLibrary(hRTFLib);
  243. #endif
  244.    return 0;
  245.    }
  246. lpUserFunctions = (LPUSERFUNCTIONS)GlobalLock(hUF);
  247. if (!lpUserFunctions)
  248.    {
  249.    FreeUpMemory();
  250. #ifdef WIN32
  251.    FreeLibrary(hRTFLib);
  252. #endif
  253.    return 0;
  254.    }
  255. hZUF = GlobalAlloc( GPTR, (DWORD)sizeof(ZIPUSERFUNCTIONS));
  256. if (!hZUF)
  257.    {
  258.    FreeUpMemory();
  259. #ifdef WIN32
  260.    FreeLibrary(hRTFLib);
  261. #endif
  262.    return 0;
  263.    }
  264. lpZipUserFunctions = (LPZIPUSERFUNCTIONS)GlobalLock(hZUF);
  265. if (!lpZipUserFunctions)
  266.    {
  267.    FreeUpMemory();
  268. #ifdef WIN32
  269.    FreeLibrary(hRTFLib);
  270. #endif
  271.    return 0;
  272.    }
  273. uf.fCanDragDrop = FALSE;
  274. #ifndef WIN32
  275. if ((hHourGlass = GetModuleHandle("SHELL"))!=0)
  276.    {
  277.    if (GetProcAddress(hHourGlass, "DragAcceptFiles" ))
  278.       uf.fCanDragDrop = TRUE;
  279.    }
  280. #else
  281. uf.fCanDragDrop = TRUE;
  282. #endif
  283. lpUserFunctions->password = password;
  284. lpUserFunctions->print = DisplayBuf;
  285. lpUserFunctions->sound = SoundDuring;
  286. lpUserFunctions->replace = GetReplaceDlgRetVal;
  287. lpUserFunctions->SendApplicationMessage = ReceiveDllMessage;
  288. lpZipUserFunctions->print = lpUserFunctions->print;//DisplayBuf;
  289. lpZipUserFunctions->password = password;
  290. lpZipUserFunctions->comment = comment;
  291. hWndMain = CreateWindow(szAppName,      /* window class     */
  292.         szAppName,                      /* window name      */
  293.         WS_OVERLAPPEDWINDOW,            /* window style     */
  294.         0, 0, 0, 0,
  295.         (HWND)0,                        /* parent handle    */
  296.         (HWND)0,                        /* menu or child ID */
  297.         hInstance,                      /* instance         */
  298.         NULL);                          /* additional info  */
  299. if ( !hWndMain )
  300.    {
  301.    FreeUpMemory();
  302. #ifdef WIN32
  303.    FreeLibrary(hRTFLib);
  304. #endif
  305.    return 0;
  306.    }
  307. #ifdef WIN32
  308. ShowSplashScreen();
  309. #endif
  310. /* Let's try to find the help file first */
  311. #ifdef WIN32
  312. if (SearchPath(
  313.     NULL,               /* address of search path               */
  314.     szHelpFileName,     /* address of filename                  */
  315.     NULL,               /* address of extension                 */
  316.     PATH_MAX,           /* size, in characters, of buffer       */
  317.     szFullPath,         /* address of buffer for found filename */
  318.     &ptr                /* address of pointer to file component */
  319.    ) != 0)
  320.    {
  321.    lstrcpy(szHelpFileName, szFullPath);
  322.    }
  323. #else
  324. hfile = OpenFile(szHelpFileName,  &ofs, OF_SEARCH);
  325. if (hfile != HFILE_ERROR)
  326.    {
  327.    lstrcpy(szHelpFileName, ofs.szPathName);
  328.    }
  329. #endif
  330. #ifndef WIN32
  331. _lclose(hfile);
  332. #endif
  333. #ifndef USE_UNZIP_LIB
  334. #ifdef WIN32
  335. if (SearchPath(
  336.     NULL,               /* address of search path               */
  337.     UNZ_DLL_NAME,       /* address of filename                  */
  338.     NULL,               /* address of extension                 */
  339.     PATH_MAX,           /* size, in characters, of buffer       */
  340.     szFullPath,         /* address of buffer for found filename */
  341.     &ptr                /* address of pointer to file component */
  342.    ) == 0)
  343. #else
  344. hfile = OpenFile(UNZ_DLL_NAME,  &ofs, OF_SEARCH);
  345. if (hfile == HFILE_ERROR)
  346. #endif
  347.    {
  348.    char str[256];
  349.    wsprintf (str, DLL_WARNING, UNZ_DLL_NAME);
  350.    MessageBox ((HWND)NULL, str, szAppName, MB_ICONHAND | MB_SYSTEMMODAL | MB_OK);
  351.    FreeUpMemory();
  352. #ifdef WIN32
  353.    DestroyWindow(hSplashScreen);
  354.    FreeLibrary(hRTFLib);
  355. #endif
  356.    return 0;
  357.    }
  358. #ifndef WIN32
  359. else
  360.    lstrcpy(szFullPath, ofs.szPathName);
  361. _lclose(hfile);
  362. #endif
  363. #ifdef WIN32
  364. /* First we'll check the unzip dll version information */
  365. dwVerInfoSize =
  366.     GetFileVersionInfoSize(szFullPath, &dwVerHnd);
  367. if (dwVerInfoSize)
  368.    {
  369.    BOOL  fRet, fRetName;
  370.    char str[256];
  371.    LPSTR   lpstrVffInfo; /* Pointer to block to hold info */
  372.    LPSTR lszVer = NULL;
  373.    LPSTR lszVerName = NULL;
  374.    UINT  cchVer = 0;
  375.    /* Get a block big enough to hold the version information */
  376.    hMem          = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
  377.    lpstrVffInfo  = GlobalLock(hMem);
  378.    /* Get the version information */
  379.    if (GetFileVersionInfo(szFullPath, 0L, dwVerInfoSize, lpstrVffInfo))
  380.       {
  381.       fRet = VerQueryValue(lpstrVffInfo,
  382.                TEXT("\StringFileInfo\040904E4\FileVersion"),
  383.               (LPVOID)&lszVer,
  384.               &cchVer);
  385.       fRetName = VerQueryValue(lpstrVffInfo,
  386.                TEXT("\StringFileInfo\040904E4\CompanyName"),
  387.                (LPVOID)&lszVerName,
  388.                &cchVer);
  389.       if (!fRet || !fRetName ||
  390.          (lstrcmpi(lszVer, UNZ_DLL_VERSION) != 0) ||
  391.          (lstrcmpi(lszVerName, COMPANY_NAME) != 0))
  392.          {
  393.          wsprintf (str, DLL_VERSION_WARNING, UNZ_DLL_NAME);
  394.          MessageBox((HWND)NULL, str, szAppName, MB_ICONSTOP | MB_OK);
  395.          FreeUpMemory();
  396.          GlobalUnlock(hMem);
  397.          GlobalFree(hMem);
  398.          DestroyWindow(hSplashScreen);
  399.          FreeLibrary(hRTFLib);
  400.          return 0;
  401.          }
  402.       }
  403.       /* free memory */
  404.    GlobalUnlock(hMem);
  405.    GlobalFree(hMem);
  406.    }
  407. else
  408.    {
  409.    char str[256];
  410.    wsprintf (str, DLL_VERSION_WARNING, UNZ_DLL_NAME);
  411.    MessageBox (hWndMain, str, szAppName, MB_ICONSTOP | MB_OK);
  412.    FreeUpMemory();
  413.    DestroyWindow(hSplashScreen);
  414.    FreeLibrary(hRTFLib);
  415.    return 0;
  416.    }
  417. #endif
  418. #endif
  419. #ifndef USE_ZIP_LIB
  420. #ifdef WIN32
  421. if (SearchPath(
  422.     NULL,               /* address of search path               */
  423.     ZIP_DLL_NAME,       /* address of filename                  */
  424.     NULL,               /* address of extension                 */
  425.     PATH_MAX,           /* size, in characters, of buffer       */
  426.     szFullPath,         /* address of buffer for found filename */
  427.     &ptr                /* address of pointer to file component */
  428.    ) == 0)
  429. #else
  430. hfile = OpenFile(ZIP_DLL_NAME,  &ofs, OF_SEARCH);
  431. if (hfile == HFILE_ERROR)
  432. #endif
  433.    {
  434.    char str[256];
  435.    wsprintf (str, DLL_WARNING, ZIP_DLL_NAME);
  436.    MessageBox((HWND)NULL, str, szAppName, MB_ICONSTOP | MB_OK);
  437.    FreeUpMemory();
  438. #ifdef WIN32
  439.    DestroyWindow(hSplashScreen);
  440.    FreeLibrary(hRTFLib);
  441. #endif
  442.    return 0;
  443.    }
  444. #ifndef WIN32
  445. else
  446.    lstrcpy(szFullPath, ofs.szPathName);
  447. _lclose(hfile);
  448. #endif
  449. #ifdef WIN32
  450. /* Now we'll check the zip dll version information */
  451. dwVerInfoSize =
  452.     GetFileVersionInfoSize(szFullPath, &dwVerHnd);
  453. if (dwVerInfoSize)
  454.    {
  455.    BOOL  fRet, fRetName;
  456.    char str[256];
  457.    LPSTR   lpstrVffInfo; /* Pointer to block to hold info */
  458.    LPSTR lszVer = NULL;
  459.    LPSTR lszVerName = NULL;
  460.    UINT  cchVer = 0;
  461.    /* Get a block big enough to hold the version information */
  462.    hMem          = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize);
  463.    lpstrVffInfo  = GlobalLock(hMem);
  464.    /* Get the version information */
  465.    GetFileVersionInfo(szFullPath, 0L, dwVerInfoSize, lpstrVffInfo);
  466.    fRet = VerQueryValue(lpstrVffInfo,
  467.               TEXT("\StringFileInfo\040904E4\FileVersion"),
  468.                (LPVOID)&lszVer,
  469.                &cchVer);
  470.    fRetName = VerQueryValue(lpstrVffInfo,
  471.                TEXT("\StringFileInfo\040904E4\CompanyName"),
  472.               (LPVOID)&lszVerName,
  473.               &cchVer);
  474.    if (!fRet || !fRetName ||
  475.       (lstrcmpi(lszVer, ZIP_DLL_VERSION) != 0) ||
  476.       (lstrcmpi(lszVerName, COMPANY_NAME) != 0))
  477.       {
  478.       wsprintf (str, DLL_VERSION_WARNING, ZIP_DLL_NAME);
  479.       MessageBox((HWND)NULL, str, szAppName, MB_ICONSTOP | MB_OK);
  480.       FreeUpMemory();
  481.       GlobalUnlock(hMem);
  482.       GlobalFree(hMem);
  483.       DestroyWindow(hSplashScreen);
  484.       FreeLibrary(hRTFLib);
  485.       return 0;
  486.       }
  487.    /* free memory */
  488.    GlobalUnlock(hMem);
  489.    GlobalFree(hMem);
  490.    }
  491. else
  492.    {
  493.    char str[256];
  494.    wsprintf (str, DLL_VERSION_WARNING, ZIP_DLL_NAME);
  495.    MessageBox((HWND)NULL, str, szAppName, MB_ICONSTOP | MB_OK);
  496.    FreeUpMemory();
  497.    GlobalUnlock(hMem);
  498.    GlobalFree(hMem);
  499.    DestroyWindow(hSplashScreen);
  500.    FreeLibrary(hRTFLib);
  501.    return 0;
  502.    }
  503. #endif /* WIN32? */
  504. #endif
  505. /* Okay, now we know that the dll's exist, and have the proper version
  506.  * information in them. We can go ahead and load them.
  507.  */
  508. #ifndef USE_UNZIP_LIB
  509. hUnzipDll = LoadLibrary(UNZ_DLL_NAME);
  510. #ifndef WIN32
  511. if (hUnzipDll > HINSTANCE_ERROR)
  512. #else
  513. if (hUnzipDll != NULL)
  514. #endif
  515.    {
  516.    (_DLL_UNZIP)Unz_SingleEntryPoint = (_DLL_UNZIP)GetProcAddress(hUnzipDll, "windll_unzip");
  517.    (_DLL_UNZVAL)Unz_Validate =
  518.       (_DLL_UNZVAL)GetProcAddress(hUnzipDll, "UzpValidate");
  519.    if (!Unz_SingleEntryPoint || !Unz_Validate)
  520.       {
  521.       char str[256];
  522.       wsprintf (str, "Could not get entry point to %s", UNZ_DLL_NAME);
  523.       MessageBox((HWND)NULL, str, szAppName, MB_ICONSTOP | MB_OK);
  524.       FreeUpMemory();
  525. #ifdef WIN32
  526.       DestroyWindow(hSplashScreen);
  527.       FreeLibrary(hRTFLib);
  528. #endif
  529.       return 0;
  530.       }
  531.    }
  532. else
  533.    {
  534.    char str[256];
  535.    wsprintf (str, "Could not load %s", UNZ_DLL_NAME);
  536.    MessageBox((HWND)NULL, str, szAppName, MB_ICONSTOP | MB_OK);
  537.    FreeUpMemory();
  538. #ifdef WIN32
  539.    DestroyWindow(hSplashScreen);
  540.    FreeLibrary(hRTFLib);
  541. #endif
  542.    return 0;
  543.    }
  544. #endif
  545. #ifndef USE_ZIP_LIB
  546. hZipDll = LoadLibrary(ZIP_DLL_NAME);
  547. #ifndef WIN32
  548. if (hZipDll > HINSTANCE_ERROR)
  549. #else
  550. if (hZipDll != NULL)
  551. #endif
  552.    {
  553.    (_DLL_ZIP)ZipArchive = (_DLL_ZIP)GetProcAddress(hZipDll, "ZpArchive");
  554.    (ZIPSETOPTIONS)ZipSetOptions = (ZIPSETOPTIONS)GetProcAddress(hZipDll, "ZpSetOptions");
  555.    (ZIPGETOPTIONS)ZipGetOptions = (ZIPGETOPTIONS)GetProcAddress(hZipDll, "ZpGetOptions");
  556.    if (!ZipArchive || !ZipSetOptions || !ZipGetOptions)
  557.       {
  558.       char str[256];
  559.       wsprintf (str, "Could not get entry point to %s", ZIP_DLL_NAME);
  560.       MessageBox((HWND)NULL, str, szAppName, MB_ICONSTOP | MB_OK);
  561.       FreeUpMemory();
  562. #ifdef WIN32
  563.       DestroyWindow(hSplashScreen);
  564.       FreeLibrary(hRTFLib);
  565. #endif
  566.       return 0;
  567.       }
  568.    }
  569. else
  570.    {
  571.    char str[256];
  572.    wsprintf (str, "Could not load %s", ZIP_DLL_NAME);
  573.    MessageBox((HWND)NULL, str, szAppName, MB_ICONSTOP | MB_OK);
  574. #ifndef USE_UNZIP_LIB
  575.    FreeLibrary(hUnzipDll);
  576. #endif
  577.    FreeUpMemory();
  578. #ifdef WIN32
  579.    DestroyWindow(hSplashScreen);
  580.    FreeLibrary(hRTFLib);
  581. #endif
  582.    return 0;
  583.    }
  584. #endif
  585. GetPrivateProfileString(szAppName, szFirstUse, "Yes", lpumb->szBuffer, 256, szWiZIniFile);
  586. if ((fFirstUse = !lstrcmpi(lpumb->szBuffer, "Yes"))!=0) /* first time used as WiZ 4.0   */
  587.    {
  588. /* Flag that this is no longer the first time.                              */
  589.    WritePrivateProfileString(szAppName, szFirstUse, "No", szWiZIniFile);
  590. /* After first use, all options come out of WIZ.INI file                  */
  591.    }
  592. InitSoundOptions();               /* initialize sound options         */
  593. wLBSelection = IDM_LB_DISPLAY;      /* assume default is to display     */
  594. hEditor = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, (DWORD)EDIT_BUF_SIZE);
  595. if (!hEditor)
  596.    {
  597.    MessageBox((HWND)NULL, "Could not allocate memory", szAppName, MB_ICONSTOP | MB_OK);
  598. #ifndef USE_UNZIP_LIB
  599.    FreeLibrary(hUnzipDll);
  600. #endif
  601. #ifndef USE_ZIP_LIB
  602.    FreeLibrary(hZipDll);
  603. #endif
  604.    FreeUpMemory();
  605. #ifdef WIN32
  606.    DestroyWindow(hSplashScreen);
  607.    FreeLibrary(hRTFLib);
  608. #endif
  609.    return 0;
  610.    }
  611. pszBuffer = (LPSTR)GlobalLock(hEditor);
  612. CreateButtonBar(hWndMain);
  613. #ifndef USE_ZIP_LIB
  614. (_ZIP_USER_FUNCTIONS)ZipInit = (_ZIP_USER_FUNCTIONS)GetProcAddress(hZipDll, "ZpInit");
  615. if (ZipInit == NULL)
  616.    {
  617.    MessageBox((HWND)NULL, "Cannot get address of ZpInit in Zip dll. Terminating...",
  618.       szAppName, MB_ICONSTOP | MB_OK);
  619. #ifndef USE_UNZIP_LIB
  620.    FreeLibrary(hUnzipDll);
  621. #endif
  622.    FreeLibrary(hZipDll);
  623.    FreeUpMemory();
  624. #ifdef WIN32
  625.    DestroyWindow(hSplashScreen);
  626.    FreeLibrary(hRTFLib);
  627. #endif
  628.    return 0;
  629.    }
  630. #endif   
  631. if (!(*ZipInit)(lpZipUserFunctions))
  632.    {
  633.    MessageBox((HWND)NULL, "Application functions not set up properly. Terminating...",
  634.       szAppName, MB_ICONSTOP | MB_OK);
  635. #ifndef USE_UNZIP_LIB
  636.    FreeLibrary(hUnzipDll);
  637. #endif
  638. #ifndef USE_UNZIP_LIB
  639.    FreeLibrary(hZipDll);
  640. #endif
  641.    FreeUpMemory();
  642. #ifdef WIN32
  643.    DestroyWindow(hSplashScreen);
  644.    FreeLibrary(hRTFLib);
  645. #endif
  646.    return 0;
  647.    }
  648. #ifndef WIN32
  649. if (_fstrlen(lpCmdLine))            /* if filename passed on start-up   */
  650. #else
  651. if (strlen(lpCmdLine))            /* if filename passed on start-up   */
  652. #endif
  653.    {
  654.    if ((lstrcmpi(&lpCmdLine[lstrlen(lpCmdLine) - 4],
  655.       ".zip") != 0) &&
  656.       (lstrcmpi(&lpCmdLine[lstrlen(lpCmdLine) - 4],
  657.       ".exe") != 0))
  658.       {
  659.       lstrcat(lpCmdLine, ".zip");
  660.       }
  661.    if (lstrcmpi(&lpCmdLine[lstrlen(lpCmdLine) - 8],
  662.       ".zip.zip") == 0)
  663.       lpCmdLine[lstrlen(lpCmdLine) - 4] = '';
  664.    if ((ofretval = OpenFile(lpCmdLine, &lpumb->of, OF_EXIST)) >= 0)
  665.       {
  666.       lstrcpy(lpumb->szFileName, lpumb->of.szPathName); /* save file name */
  667.       /* If valid filename change dir to where it lives */
  668.       GetArchiveDir(lpumb->szDirName); /* get archive dir. in ANSI char set */
  669.       if (uf.fUnzipToZipDir || /* unzipping to same directory as archive */
  670.           szUnzipToDirName[0] == '') /* or no default */
  671.           {
  672.           /* take only path portion */
  673.           lstrcpy(szUnzipToDirName, lpumb->szDirName);
  674.           }
  675.       lstrcpy(lpumb->szBuffer, lpumb->szDirName);
  676.       DlgDirList(hWndMain, lpumb->szBuffer, 0, 0, 0); /* go to where archive lives */
  677.       }
  678.    else /* bad file name */
  679.       {
  680.       wsprintf (lpumb->szBuffer, "Cannot open %s", lpCmdLine);
  681.       MessageBox (NULL, lpumb->szBuffer, szAppName, MB_ICONINFORMATION | MB_OK);
  682.       lpumb->szFileName[0] = ''; /* pretend filename doesn't exist  */
  683.       lpumb->szDirName[0] = ''; /* pretend archive dir. doesn't exist  */
  684.       }
  685.    }
  686. if (uf.fUnzipToZipDir || /* unzipping to same directory as archive */
  687.     szUnzipToDirName[0] == '') /* or no default */
  688.     {
  689.     char szLaunchPath[PATH_MAX];
  690. #ifdef WIN32
  691.     GetCurrentDirectory(PATH_MAX, (LPTSTR)szLaunchPath);
  692. #else
  693.  getcwd(szLaunchPath, PATH_MAX); /* get current drive and directory */
  694. #endif
  695.  lstrcpy(lpumb->szDirName, szLaunchPath);
  696.  lstrcpy(szUnzipToDirName, lpumb->szDirName);
  697.  }
  698. UpdateListBox();
  699. UpdateButtons();
  700. /* Enable/Disable buttons */
  701. WinAssert(hSelectAll);
  702. EnableWindow( hSelectAll, FALSE);
  703. WinAssert(hDeselectAll);
  704. EnableWindow( hDeselectAll, FALSE);
  705. WinAssert(hSelectPattern);
  706. EnableWindow( hSelectPattern, FALSE);
  707. /* Throw up splash screen */
  708. #ifdef WIN32
  709. second = (GetTickCount()/1000) + 5;
  710. while ((GetTickCount()/1000) <= second);
  711. DestroyWindow(hSplashScreen);
  712. #endif
  713. SizeWindow();
  714. WinAssert(hWndMain);
  715. ShowWindow(hWndMain, nCmdShow);
  716. ShowWindow(hWndList, SW_SHOW);
  717. ShowWindow(hWndStatic, SW_SHOW);
  718. ShowWindow(hWndEdit, SW_SHOW);
  719. /* On first use, throw up About box, saying what WiZ is, etc. */
  720. if (fFirstUse)
  721.    {
  722.    PostMessage(hWndMain, WM_COMMAND, IDM_ABOUT, 0L);
  723.    }
  724. hHelpCursor = LoadCursor(hInstance, "HelpCursor");
  725. while ( GetMessage(&lpumb->msg, 0, 0, 0) )
  726.    {
  727.    if (hPatternSelectDlg == 0 || /* Pattern select dialog is non-modal */
  728.       !IsDialogMessage(hPatternSelectDlg, &lpumb->msg))
  729.       {
  730.       /* What we are doing here is to intercept the right mouse button up
  731.          command if it is being sent to Wiz's main window, or any of it's
  732.          child windows - such as the list box or edit box. We then process
  733.          the WM_RBUTTONUP message for either the listbox or the editbox
  734.          as though it were sent to the main window. Another way to do this
  735.          would be to subclass both those windows, but this seems a lot
  736.          easier, with less code involved.
  737.          This would also be much easier if we were only dealing with 32
  738.          bit windows, but we also have to deal with the 16 bit version.
  739.        */
  740.       if ((lpumb->msg.message == WM_RBUTTONUP) &&
  741.          ((lpumb->msg.hwnd == hWndStatic) ||
  742.          (lpumb->msg.hwnd == hWndEdit) ||
  743.          (lpumb->msg.hwnd == hWndList)))
  744.          {
  745.          lpumb->msg.hwnd = hWndMain;
  746.          DispatchMessage(&lpumb->msg);
  747.          }
  748.       else
  749.            if ( !TranslateAccelerator(hWndMain, hAccTable, &lpumb->msg) )
  750.               {
  751.               TranslateMessage(&lpumb->msg);
  752.               DispatchMessage(&lpumb->msg);
  753.               }
  754.       }
  755.    }
  756. /* Don't turn on compiler aliasing or C7 will move */
  757. /* the following assignment after the GlobalFree() */
  758. /* which contains the memory for pumb! */
  759. i = (int)lpumb->msg.wParam;
  760. FreeUpMemory();
  761. #ifndef USE_UNZIP_LIB
  762. FreeLibrary(hZipDll);
  763. #endif
  764. #ifndef USE_ZIP_LIB
  765. FreeLibrary(hUnzipDll);
  766. #endif
  767. #ifdef WIN32
  768. FreeLibrary(hRTFLib);
  769. #endif
  770. return i;
  771. }
  772. int WINAPI GetReplaceDlgRetVal(char *filename)
  773. {
  774. FARPROC lpfnprocReplace;
  775. int ReplaceDlgRetVal;   /* replace dialog return value */
  776. ShowCursor(FALSE);      /* turn off cursor */
  777. SetCursor(hSaveCursor); /* restore the cursor */
  778. lpfnprocReplace = MakeProcInstance(ReplaceProc, hInst);
  779. ReplaceDlgRetVal = DialogBoxParam(hInst, "Replace",
  780.    hWndMain, lpfnprocReplace, (DWORD)(LPSTR)filename);
  781. #ifndef WIN32
  782. FreeProcInstance(lpfnprocReplace);
  783. #endif
  784. hSaveCursor = SetCursor(hHourGlass);
  785. ShowCursor(TRUE);
  786. return ReplaceDlgRetVal;
  787. }
  788. void FreeUpMemory(void)
  789. {
  790. if (hStrings)
  791.    {
  792.    GlobalUnlock(hStrings);
  793.    GlobalFree(hStrings);
  794.    }
  795. if (hDCL)
  796.    {
  797.    GlobalUnlock(hDCL);
  798.    GlobalFree(hDCL);
  799.    }
  800. if (hEditor)
  801.    {
  802.    GlobalUnlock(hEditor);
  803.    GlobalFree(hEditor);
  804.    }
  805. if (hUF)
  806.    {
  807.    GlobalUnlock(hUF);
  808.    GlobalFree(hUF);
  809.    }
  810. if (hZUF)
  811.    {
  812.    GlobalUnlock(hZUF);
  813.    GlobalFree(hZUF);
  814.    }
  815. }
  816. #ifdef WIN32
  817. BOOL IsNT(VOID)
  818. {
  819. if(dwPlatformId != 0xFFFFFFFF)
  820.    return dwPlatformId;
  821. else
  822. /* note: GetVersionEx() doesn't exist on WinNT 3.1 */
  823.    {
  824.    if(GetVersion() < 0x80000000)
  825.       {
  826.       (BOOL)dwPlatformId = TRUE;
  827.       }
  828.    else
  829.       {
  830.       (BOOL)dwPlatformId = FALSE;
  831.       }
  832.     }
  833. return dwPlatformId;
  834. }
  835. #endif