home *** CD-ROM | disk | FTP | other *** search
/ PC Gamer 2.1 / 1996-02_Disc_2.1.iso / czone95 / comix.mst < prev    next >
Text File  |  1995-10-09  |  26KB  |  740 lines

  1. '**************************************************************************
  2. '*                  MS Test script for Comix Zone setup program
  3. '**************************************************************************
  4.  
  5. '' $DEFINE DEBUG  ''Define for script development/debugging
  6.  
  7. '$INCLUDE 'setupapi.inc'
  8. '$INCLUDE 'msdetect.inc'
  9.  
  10. ''Dialog ID's
  11. CONST WELCOME                  = 100
  12. CONST ASKQUIT                  = 200
  13. CONST DESTPATH                 = 300
  14. CONST EXITFAILURE              = 400
  15. CONST EXITQUIT                 = 600
  16. CONST EXITSUCCESS              = 700
  17. CONST OPTIONS                  = 800
  18. CONST BADPATH                  = 6400
  19.  
  20. CONST HELPWELCOME              = 1000
  21. CONST VERPATH                  = 1100
  22. CONST EXITFAILNOTWIN31         = 1200
  23. CONST EXITFAILNOTENH           = 1300
  24. CONST EXITFAILNOTPAGING        = 1325
  25. CONST EXITFAILNOTINTEL         = 1350
  26. CONST EXITFAILRUNAPP           = 1360
  27. CONST COMIXINST             = 1400
  28. CONST COMIXINSTNOWIN32S     = 1450
  29. CONST COMIXPATH             = 1500
  30. CONST HELPCOMIX             = 1600
  31.  
  32.  
  33. ''Bitmap ID
  34. CONST LOGO = 1
  35.  
  36. ''GetTempFileName flags
  37. CONST TF_FORCEDRIVE            = 128
  38.  
  39. GLOBAL DESTWIN$      ''Windows directory.
  40. GLOBAL DESTSYS$      ''Windows\System directory.
  41. GLOBAL DEST32S$      ''Windows\System\Win32s directory
  42. GLOBAL DESTCOMIX$     ''Comix Zone directory
  43. GLOBAL OLE_PROTECT%  ''Indicates whether ole2 dlls were protected from being
  44.                      '' copied.
  45. GLOBAL OLE_OLEBOOT%
  46. GLOBAL VERNUM$       '' Win32s Version Number (i.e., for v1.25 VERNUM$="125"
  47.  
  48. DECLARE SUB Install(OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%)
  49. DECLARE SUB RecoverFromCopy(szFileName$)
  50. DECLARE SUB UpdateSystemIni
  51. DECLARE FUNCTION RebootSystem(OLEONLY%) AS INTEGER
  52. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  53. DECLARE FUNCTION MakeSystemIni LIB "INIUPD.DLL" (arg1$, arg2$) AS INTEGER
  54. DECLARE FUNCTION RestartWindows LIB "INIUPD.DLL" AS INTEGER
  55. DECLARE FUNCTION OnWindowsNT LIB "INIUPD.DLL" AS INTEGER
  56. DECLARE FUNCTION PagingEnabled LIB "INIUPD.DLL" AS INTEGER
  57. DECLARE FUNCTION ShareEnabled LIB "INIUPD.DLL" AS INTEGER
  58. DECLARE FUNCTION IsWin32sLoaded LIB "INIUPD.DLL" (arg1$) AS INTEGER
  59. DECLARE FUNCTION IsRunningApp LIB "INIUPD.DLL" AS INTEGER
  60. DECLARE FUNCTION SetCuiFlags LIB "MSCUISTF.DLL" (arg1%, arg2%) AS INTEGER
  61. DECLARE FUNCTION ExitWindowsExec LIB "USER.EXE" (arg1$, arg2$) AS INTEGER
  62. DECLARE FUNCTION GetModuleHandle LIB "KRNL386.EXE" (arg1$) AS INTEGER
  63. DECLARE FUNCTION LoadLibrary LIB "KRNL386.EXE" (arg1$) AS INTEGER
  64. DECLARE SUB FreeLibrary LIB "KRNL386.EXE" (arg1%)
  65. DECLARE FUNCTION SetErrorMode LIB "KRNL386.EXE" (arg1%) AS INTEGER
  66.  
  67. DECLARE FUNCTION GetTempFileName LIB "KRNL386.EXE" (drive%, prefix$, u%, filename$) AS INTEGER
  68. DECLARE SUB WriteLine LIB "INIUPD.DLL" (filename$, text$)
  69. DECLARE FUNCTION GetTempFileAt(szDir$, szPrefix$) as string
  70. INIT:
  71.     CUIDLL$ = "mscuistf.dll"            '' Custom user interface dll
  72.     HELPPROC$ = "FHelpDlgProc"          '' Help dialog procedure
  73.     szOldVer$ ="1.00.000     "          '' Reserve space in string for version
  74.     WIN32ENABLED% = 0
  75.     OLEONLY% = 0
  76.     OLE2_16% = 0
  77.     OLE2AUTO_16% = 0
  78.     OLE16RUNAPP% = 0
  79.     OLE_PROTECT% = 0
  80.     OLE_OLEBOOT% = 0
  81.  
  82.     ON ERROR GOTO ERRNORMAL
  83.     SetRestartDir GetWindowsDir()
  84.  
  85.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  86.  
  87.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  88.     IF szInf$ = "" THEN
  89.         szInf$ = GetSymbolValue("STF_CWDDIR") + "comix.inf"
  90.     END IF
  91.     ReadInfFile szInf$
  92.  
  93.     SetBitmap CUIDLL$, LOGO
  94.  
  95.     WIN32SVER$ = MID$(GetSectionKeyVersion("WindowsSystem", "win32s16"), 1, 4)
  96. '    SetTitle "Microsoft Win32s version " + WIN32SVER$ + " Setup Program"
  97.     VERNUM$ = MID$(WIN32SVER$, 1, 1) + MID$(WIN32SVER$, 3 , 2)
  98.  
  99.     DESTWIN$ = GetWindowsDir()
  100.     DESTSYS$ = GetWindowsSysDir()
  101.     DEST32S$ = DESTSYS + "WIN32S\"
  102.  
  103. '$IFDEF DEBUG
  104.     i% = SetSizeCheckMode(scmOnIgnore)    '' could use scmOff; def = scmOnFatal
  105.     WinDrive$ = MID$(GetWindowsDir, 1, 1)
  106.     IF IsDriveValid(WinDrive$) = 0 THEN
  107.         i% = DoMsgBox("Windows drive ('"+WinDrive$+"') is not a valid drive.", "DEBUG", MB_TASKMODAL+MB_ICONHAND+MB_OK)
  108.         GOTO QUIT
  109.     END IF
  110. '$ENDIF ''DEBUG
  111.  
  112. CHECK:
  113.     '' Can not run on versions less than 3.10.
  114.     WINDOWSVERSION = GetWindowsMajorVersion * 100 + GetWindowsMinorVersion
  115.     IF WINDOWSVERSION < 310 THEN
  116.         ExitCode% = EXITFAILNOTWIN31
  117.         GOTO QUIT
  118.     END IF
  119.     '' Check that we are not runnig on Chicago, including pre-released
  120.     '' Chicago versions.
  121.     IF WINDOWSVERSION > 350 THEN
  122.         ExitCode% = EXITSUCCESS
  123.         WIN32ENABLED% = 1
  124.         GOTO COMIX
  125.     END IF
  126.     IF GetWindowsMode < 2  THEN
  127.         IF OnWindowsNT() THEN
  128.             ExitCode% = EXITFAILNOTINTEL '' Running on Windows NT (on RISC)
  129.         ELSE
  130.             ExitCode% = EXITFAILNOTENH   '' Standard Mode Windows
  131.         END IF
  132.         GOTO QUIT
  133.     END IF
  134.     IF OnWindowsNT() THEN
  135.         ExitCode% = EXITSUCCESS
  136.         WIN32ENABLED% = 1
  137.         GOTO COMIX
  138.     END IF
  139.     ExitCode% = EXITSUCCESS
  140.  
  141.     if IsRunningApp() <> 0 THEN
  142.         ExitCode% = EXITFAILRUNAPP
  143.         GOTO QUIT
  144.     END IF
  145.  
  146.     '' Get version of Win32s to be installed from version info in INF file
  147.     szNewVer$ = GetSectionKeyVersion("WindowsSystem", "win32s16")
  148.  
  149.     '' See if OLE is included.
  150.  
  151.     OLEINCLUDED% = DoesFileExist( GetSymbolValue("STF_SRCDIR") + "OLE2THK.DL_", femExists )
  152.  
  153.     IF OLEINCLUDED% = 1 THEN
  154.         '' See whether one of the OLE 16 bit components is loaded.
  155.         IF GetModulehandle("compobj") <> 0 THEN
  156.             OLE16RUNAPP% = 1
  157.             GOTO GetOleVersion
  158.         END IF
  159.         IF GetModuleHandle("ole2") <> 0 THEN
  160.             OLE16RUNAPP% = 1
  161.             GOTO GetOleVersion
  162.         END IF
  163.         IF GetModuleHandle("ole2prox") <> 0 THEN
  164.             OLE16RUNAPP% = 1
  165.             GOTO GetOleVersion
  166.         END IF
  167.         IF GetModuleHandle("ole2conv") <> 0 THEN
  168.             OLE16RUNAPP% = 1
  169.             GOTO GetOleVersion
  170.         END IF
  171.         IF GetModuleHandle("storage") <> 0 THEN
  172.             OLE16RUNAPP% = 1
  173.             GOTO GetOleVersion
  174.         END IF
  175.         IF GetModuleHandle("ole2nls") <> 0 THEN
  176.             OLE16RUNAPP% = 1
  177.             GOTO GetOleVersion
  178.         END IF
  179.         IF GetModuleHandle("ole2disp") <> 0 THEN
  180.             OLE16RUNAPP% = 1
  181.             GOTO GetOleVersion
  182.         END IF
  183.         IF GetModuleHandle("typelib") <> 0 THEN
  184.             OLE16RUNAPP% = 1
  185.             GOTO GetOleVersion
  186.         END IF
  187.  
  188. GetOleVersion:
  189.         szOleNewVer$ = GetSectionKeyVersion("OleWindowsSystemWin32s", "ole2thk")
  190.  
  191.         '' Get version of currently installed OLE32 from version info of
  192.         '' ole2thk file
  193.         szOleOldVer$ = GetVersionOfFile( DESTSYS$ + "WIN32S\OLE2THK.DLL" )
  194.  
  195.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "COMPOBJ.DLL" )
  196.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "compobj")
  197.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  198.             OLE2_16% = 1
  199.         END IF
  200.  
  201.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2.DLL" )
  202.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2")
  203.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  204.             OLE2_16% = 1
  205.         END IF
  206.  
  207.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2PROX.DLL" )
  208.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2prox")
  209.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  210.             OLE2_16% = 1
  211.         END IF
  212.  
  213.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "STORAGE.DLL" )
  214.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "storage")
  215.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  216.             OLE2_16% = 1
  217.         END IF
  218.  
  219.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2CONV.DLL" )
  220.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2conv")
  221.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  222.             OLE2_16% = 1
  223.         END IF
  224.  
  225.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2NLS.DLL" )
  226.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2nls")
  227.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  228.             OLE2AUTO_16% = 1
  229.         END IF
  230.  
  231.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2DISP.DLL" )
  232.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2disp")
  233.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  234.             OLE2AUTO_16% = 1
  235.         END IF
  236.  
  237.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "TYPELIB.DLL" )
  238.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "typelib")
  239.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  240.             OLE2AUTO_16% = 1
  241.         END IF
  242.  
  243.     END IF
  244.  
  245.     OLE2_32% = OLEINCLUDED%
  246.  
  247.     '' Check if Win32s is partially installed
  248.     sz$ = GetIniKeyString (DESTSYS$ + "WIN32S.INI", "Win32s", "Setup")
  249.     '' If WIN32S.INI specifies Win32s Setup=0, then force complete Win32s file overwrite
  250.     IF sz$ = "0" THEN
  251.         GOTO WELCOME
  252.     END IF
  253.     '' If WIN32S.INI is missing, try and reinstall Win32s files/recreate WIN32S.INI
  254.     IF sz$ <> "1" THEN
  255.         GOTO WELCOME
  256.     END IF
  257.  
  258.     '' If Win32s is already installed, get running version number
  259.     i% = DoesFileExist( DESTSYS$ + "W32SYS.DLL", femExists )
  260.     IF i% = 1 THEN
  261.         i% = IsWin32sLoaded( szOldVer$ )
  262.     ENDIF
  263.  
  264.     IF i% = 0 THEN
  265.         GOTO WELCOME
  266.     END IF
  267.  
  268.     IF szNewVer$ > szOldVer$ THEN
  269.         GOTO WELCOME
  270.     END IF
  271.  
  272.     IF OLEINCLUDED% = 1 THEN
  273.  
  274.         OLE2_32% = 0
  275.  
  276.         IF (szNewVer$ = szOldVer$) OR (szNewVer$ < szOldVer$) THEN
  277.             '' Compare OLE32 version and versions of each of OLE16 libraries.
  278.             sz$ = GetIniKeyString (DESTSYS$ + "WIN32S.INI", "OLE", "Setup")
  279.             '' If WIN32S.INI specifies OLE2 Setup=0, then force OLE2 file overwrite
  280.             IF ((sz$ <> "1") OR (szOleNewVer$ > szOleOldVer$)) THEN
  281.                 OLEONLY% = 1
  282.                 OLE2_32% = 1
  283.                 GOTO WELCOME
  284.             END IF
  285.  
  286.             IF OLE2_16% OR OLE2AUTO_16 THEN
  287.                 OLEONLY% = 1
  288.                 GOTO WELCOME
  289.             END IF
  290.  
  291.         END IF
  292.  
  293.     END IF
  294.  
  295.     WIN32ENABLED% = 1
  296.     GOTO COMIX
  297.  
  298. WELCOME:
  299.     i% = SetCuiFlags(OLEONLY%, OLE16RUNAPP%)
  300.     sz$ = UIStartDlg(CUIDLL$, WELCOME, "FInfoDlgProc", HELPWELCOME, HELPPROC$)
  301.     IF sz$ = "CONTINUE" THEN
  302.         UIPop 1
  303.     ELSE
  304.         UIPop 1
  305.         GOSUB ASKQUIT
  306.         GOTO WELCOME
  307.     END IF
  308.  
  309.  
  310. GETWIN32SPATH:
  311.     IF PagingEnabled() = 0 THEN
  312.         i% = DoMsgBox("Use the Control Panel 386 Enhanced icon and configure Windows using the Virtual Memory option.", "Win32s requires Virtual Memory", MB_TASKMODAL+MB_ICONHAND+MB_OK)
  313.         ExitCode% = EXITFAILURE '' Enhanced mode but not paging
  314.         GOTO QUIT
  315.     END IF
  316.  
  317.     IF ShareEnabled() = 0 THEN
  318.         i% = DoMsgBox( "File-sharing must be enabled. Run SHARE.EXE before starting Windows or add SHARE.EXE to your AUTOEXEC.BAT file.", "Win32s Setup: SHARE.EXE is not loaded", MB_TASKMODAL+MB_ICONEXCLAMATION+MB_OK)
  319.     END IF
  320.  
  321.     SetSymbolValue "EditTextIn", DESTSYS$
  322.     SetSymbolValue "EditFocus", "END"
  323.  
  324. GETPATHL1:
  325.     sz$ = UIStartDlg(CUIDLL$, VERPATH, "FDispDlgProc", HELPWELCOME, HELPPROC$)
  326.  
  327.     IF sz$ = "CONTINUE" THEN
  328.         IF IsDirWritable(DESTSYS$) = 0 THEN
  329.             GOSUB BADPATH
  330.             GOTO GETPATHL1
  331.         END IF
  332.         UIPop 1
  333.     ELSEIF sz$ = "REACTIVATE" THEN
  334.         UIPop 1
  335.         GOTO GETPATHL1
  336.     ELSEIF sz$ = "BACK" THEN
  337.         UIPop 1
  338.         GOTO WELCOME
  339.     ELSE
  340.         UIPop 1
  341.         GOSUB ASKQUIT
  342.         GOTO GETPATHL1
  343.     END IF
  344.  
  345. COPYFILES:
  346.     IF OLEONLY% = 0 THEN
  347.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Setup", "0", cmoOverwrite
  348.     END IF
  349.     IF OLE2_32% = 1 THEN
  350.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Setup", "0", cmoOverwrite
  351.     END IF
  352.  
  353.     '' Indicate Win32s install failure until all files known to be copied.
  354.     ExitCode% = EXITFAILURE
  355.     ERR = 0
  356.     CreateDir DEST32S$, cmoNone
  357.     Install OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%
  358.     UpdateSystemIni
  359.     '' Terminate if unhandled fatal error
  360.     IF ERR <> 0 THEN
  361.     GOTO QUIT
  362.     END IF
  363.  
  364.     IF OLEONLY% = 0 THEN
  365.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Setup", "1", cmoOverwrite
  366.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Version", szNewVer$, cmoOverwrite
  367.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Nls", "AnsiCP", "1252", cmoOverwrite
  368.     END IF
  369.     IF OLE2_32% = 1 THEN
  370.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Setup", "1", cmoOverwrite
  371.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Version", szOleNewVer, cmoOverwrite
  372.     END IF
  373.  
  374.     i% = DoMsgBox("Win32s files successfully installed.", "Microsoft Win32s Setup", MB_OK+MB_TASKMODAL)
  375.     '' Indicate Win32s correctly copied and installed.
  376.     ExitCode% = EXITSUCCESS
  377.  
  378. COMIX:
  379.     IF OLEONLY% = 1 THEN
  380.         GOTO QUIT
  381.     ENDIF
  382.     IF WIN32ENABLED% = 0 THEN
  383.         sz$ = UIStartDlg(CUIDLL$, COMIXINST, "FInfoDlgProc",0, "")
  384.         UIPop 1
  385.         IF sz$ <> "CONTINUE" THEN
  386.             GOTO QUIT
  387.         END IF
  388.     END IF
  389.  
  390. GETCOMIXPATH:
  391.     DESTCOMIX$ = "C:\SEGA\COMIX\"
  392.     SetSymbolValue "EditTextIn", DESTCOMIX$
  393.     SetSymbolValue "EditFocus", "END"
  394.  
  395. GETCOMIXPATHL1:
  396.     sz$ = UIStartDlg(CUIDLL$, COMIXPATH, "FEditDlgProc", HELPCOMIX, HELPPROC$)
  397.  
  398.     IF sz$ = "CONTINUE" THEN
  399.         DESTCOMIX$ = GetSymbolValue("EditTextOut")
  400.  
  401.         IF MID$(DESTCOMIX$, LEN(DESTCOMIX$), 1) <> "\" THEN
  402.             DESTCOMIX$ = DESTCOMIX$ + "\"
  403.         END IF
  404.         ''Validate new path.
  405.         IF IsDirWritable(DESTCOMIX$) = 0 THEN
  406.             GOSUB BADPATH
  407.             GOTO GETCOMIXPATHL1
  408.         END IF
  409.         UIPop 1
  410.  
  411.         GOTO COPYCOMIX
  412.     ELSEIF sz$ = "REACTIVATE" THEN
  413.         GOTO GETCOMIXPATHL1
  414.     ELSEIF sz$ = "EXIT" THEN
  415.         UIPop 1
  416.         GOTO QUIT
  417.     END IF
  418.  
  419. COPYCOMIX:
  420.     ClearCopyList
  421.     CreateDir DESTCOMIX$, cmoNone
  422.  
  423.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  424.  
  425.     ERR = 0
  426.     AddSectionFilesToCopyList "Comix", SrcDir$, DESTCOMIX$
  427.     IF WINDOWSVERSION > 350 THEN
  428.         AddSectionFilesToCopyList "Comix32", SrcDir$, DESTCOMIX$
  429.     ELSE
  430.         AddSectionFilesToCopyList "Comix16", SrcDir$, DESTCOMIX$
  431.     END IF
  432.     AddSectionFilesToCopyList "Comix System", SrcDir$, DESTSYS$
  433.     CopyFilesInCopyList
  434.     '' If error copying Comix Zone, not a fatal error. Win32s is already installed.
  435.     IF ERR <> 0 THEN
  436.     ERR = 0
  437.     GOTO QUIT
  438.     END IF
  439.     ERR = 0
  440.  
  441.     IF DoesFileExist( DESTSYS$ + "WIN32S.INI", femExists ) THEN
  442.     CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Comix", "Setup", "1", cmoOverwrite
  443.     CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Comix", "Version", szNewVer$, cmoOverwrite
  444.     END IF
  445.  
  446.     ERR = 0
  447.     CreateProgmanGroup "SEGA Arcade", "", cmoNone
  448.     ShowProgmanGroup   "SEGA Arcade", 1, cmoNone
  449.     CreateProgmanItem  "SEGA Arcade", "Comix Zone", DESTCOMIX$ + "COMIX.EXE", "", cmoOverwrite
  450.     '' Only put up success dialog if icon added to group
  451.     IF ERR = 0 THEN
  452.     i% = DoMsgBox("Comix Zone was successfully installed.", "Comix Zone Setup", MB_OK+MB_TASKMODAL)
  453.     CreateIniKeyValue "WIN.INI", "Comix", "path", DESTCOMIX$, cmoOverwrite
  454.     CreateIniKeyValue "WIN.INI", "Comix", "files", SrcDir$, cmoOverwrite
  455.     END IF
  456.     ERR = 0
  457.  
  458. QUIT:
  459.     '' Install error handler for final message box routines
  460.     ON ERROR GOTO ERRQUIT
  461.     IF ERR = 0 THEN
  462.         dlg% = ExitCode%
  463.     ELSEIF ERR = STFQUIT THEN
  464.         IF (OLE_PROTECT% = 1) THEN
  465.             '' Free all previously loaded libraries
  466.             FreeLibrary GetModuleHandle("compobj")
  467.             FreeLibrary GetModuleHandle("ole2")
  468.             FreeLibrary GetModuleHandle("ole2prox")
  469.             FreeLibrary GetModuleHandle("ole2conv")
  470.             FreeLibrary GetModuleHandle("storage")
  471.             FreeLibrary GetModuleHandle("ole2nls")
  472.             FreeLibrary GetModuleHandle("ole2disp")
  473.             FreeLibrary GetModuleHandle("typelib")
  474.         END IF
  475.         dlg% = EXITQUIT
  476.         ExitCode% = EXITQUIT
  477.     ELSE
  478.         dlg% = EXITFAILURE
  479.         ExitCode% = EXITQUIT
  480.     END IF
  481.  
  482. QUITL1:
  483.     IF WIN32ENABLED% = 1 THEN
  484.         UIPop 1
  485.         END
  486.     END IF
  487.  
  488.     sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfo0DlgProc", 0, "")
  489.     IF sz$ = "REACTIVATE" THEN
  490.         GOTO QUITL1
  491.     END IF
  492.     UIPop 1
  493.  
  494.     IF ExitCode% = EXITSUCCESS THEN
  495.         IF RebootSystem(OLEONLY% and not OLE_OLEBOOT%) = 0 THEN
  496.             CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Setup", "0", cmoOverwrite
  497.             IF OLE2_32% = 1 THEN
  498.                 CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Setup", "0", cmoOverwrite
  499.             END IF
  500.             i% = DoMsgBox("Win32s is not properly configured and Win32s Setup must be run again.", "Unable to Restart Windows", MB_ICONEXCLAMATION+MB_OK+MB_TASKMODAL)
  501.         END IF
  502.     ENDIF
  503.  
  504.     END
  505.  
  506. '' Fatal error handler for error message routine
  507. ERRQUIT:
  508.     i% = DoMsgBox("Setup sources were corrupted!", "Setup Message", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  509.     END
  510.  
  511. '' Bypass run-time errors. Let final dialog box display fatal error message.
  512. ERRNORMAL:
  513.     '' Check if user cancelled setup
  514.     IF ERR = STFQUIT THEN
  515.     GOTO QUIT
  516.     END IF
  517.     RESUME NEXT
  518.  
  519.  
  520. BADPATH:
  521.     sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfo0DlgProc", 0, "")
  522.     IF sz$ = "REACTIVATE" THEN
  523.         GOTO BADPATH
  524.     END IF
  525.         UIPop 1
  526.     RETURN
  527.  
  528.   ASKQUIT:
  529.     sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
  530.  
  531.     IF sz$ = "EXIT" THEN
  532.         UIPop 1
  533.         UIPopAll
  534.         ERROR STFQUIT
  535.     ELSEIF sz$ = "REACTIVATE" THEN
  536.         GOTO ASKQUIT
  537.     ELSE
  538.         UIPop 1
  539.     END IF
  540.     RETURN
  541.  
  542.  
  543.  
  544. '**
  545. '** Purpose:
  546. '**     Builds the copy list and performs all installation operations.
  547. '** Arguments:
  548. '**     none.
  549. '** Returns:
  550. '**     none.
  551. '*************************************************************************
  552. SUB Install(OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%) STATIC
  553.  
  554.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  555.  
  556.     '' Use file layout sections that specify OLDER file version/time check
  557.     IF OLEONLY% = 0 THEN
  558.         AddSectionFilesToCopyList "WindowsSystem", SrcDir$, DESTSYS$
  559.         AddSectionFilesToCopyList "WindowsSystemWin32s", SrcDir$, DESTSYS$ + "WIN32S\"
  560.         '' Add obsolete files to be removed
  561.         AddSectionFilesToCopyList "Win32sSystemObsoleteFiles", SrcDir$, DESTSYS$ + "WIN32S\"
  562.     END IF
  563.  
  564.     OLE_PROTECT% = 0
  565.     OLEINCLUDED% = DoesFileExist( GetSymbolValue("STF_SRCDIR") + "OLE2THK.DL_", femExists )
  566.     if OLEINCLUDED% = 1 THEN
  567.         IF (OLE2_16% = 1) OR (OLE2AUTO_16% = 1) THEN
  568.             IF OLE16RUNAPP% = 1 THEN
  569.                 '' Force all OLE2 DLLS to be copied during reboot.
  570.                 i% = SetErrorMode(-32768)
  571.                 i% = LoadLibrary(DESTSYS$ + "compobj.dll")
  572.                 i% = LoadLibrary(DESTSYS$ + "ole2.dll")
  573.                 i% = LoadLibrary(DESTSYS$ + "ole2prox.dll")
  574.                 i% = LoadLibrary(DESTSYS$ + "ole2conv.dll")
  575.                 i% = LoadLibrary(DESTSYS$ + "storage.dll")
  576.                 i% = LoadLibrary(DESTSYS$ + "ole2nls.dll")
  577.                 i% = LoadLibrary(DESTSYS$ + "ole2disp.dll")
  578.                 i% = LoadLibrary(DESTSYS$ + "typelib.dll")
  579.                 OLE_PROTECT% = 1
  580.             END IF
  581.             AddSectionFilesToCopyList "OleWindowsSystem", SrcDir$, DESTSYS$
  582.         END IF
  583.         IF OLE2_32% = 1 THEN
  584.             AddSectionFilesToCopyList "OleWindowsSystemWin32s", SrcDir$, DESTSYS$ + "WIN32S\"
  585.         END IF
  586.         IF (OLE2_16% = 1) OR (OLE2_32% = 1) OR (OLE2AUTO_16% = 1) THEN
  587.             AddSectionFilesToCopyList "Ole2RegWindowsSystem", SrcDir$, DESTSYS$
  588.         END IF
  589.         IF (OLE2AUTO_16% = 1) THEN
  590.             AddSectionFilesToCopyList "StdoleWindowsSystem", SrcDir$, DESTSYS$
  591.             IF (OLE16RUNAPP and DoesFileExist(DESTSYS$ + "stdole.tlb", femExists) ) THEN
  592.                 ' copy stdole.tlb -> tempfile1
  593.                 stdole1$ = DESTSYS$ + GetTempFileAt(DESTSYS$, "STD")
  594.                 CopyFile DESTSYS$+"STDOLE.TLB", stdole1$, cmoOverwrit, 0
  595.                 OLE_OLEBOOT% = 1
  596.             ENDIF
  597.         END IF
  598.     END IF
  599.  
  600.     SetRestartDir GetWindowsDir()
  601.  
  602.     CopyFilesInCopyList
  603.  
  604.     IF (OLEINCLUDED% = 1) THEN
  605.         RecoverFromCopy DESTSYS$ + "compobj.dll"
  606.         RecoverFromCopy DESTSYS$ + "ole2.dll"
  607.         RecoverFromCopy DESTSYS$ + "ole2prox.dll"
  608.         RecoverFromCopy DESTSYS$ + "ole2conv.dll"
  609.         RecoverFromCopy DESTSYS$ + "storage.dll"
  610.         RecoverFromCopy DESTSYS$ + "ole2nls.dll"
  611.         RecoverFromCopy DESTSYS$ + "ole2disp.dll"
  612.         RecoverFromCopy DESTSYS$ + "typelib.dll"
  613.     END IF
  614.  
  615.     IF (OLE_PROTECT% = 1) THEN
  616.         '' Free all previously loaded libraries
  617.         FreeLibrary GetModuleHandle("compobj")
  618.         FreeLibrary GetModuleHandle("ole2")
  619.         FreeLibrary GetModuleHandle("ole2prox")
  620.         FreeLibrary GetModuleHandle("ole2conv")
  621.         FreeLibrary GetModuleHandle("storage")
  622.         FreeLibrary GetModuleHandle("ole2nls")
  623.         FreeLibrary GetModuleHandle("ole2disp")
  624.         FreeLibrary GetModuleHandle("typelib")
  625.         OLE_PROTECT% = 0
  626.     END IF
  627.     IF (OLE_OLEBOOT% = 1) THEN
  628.             'rename new stdole.tlb -> tempfile2
  629.             stdole2$ = GetTempFileAt(DESTSYS$, "STD")
  630.             RemoveFile DESTSYS$+stdole2$, cmoForce
  631.             RenameFile DESTSYS$+"STDOLE.TLB" , stdole2$
  632.             'rename tempfile1 -> stdole.tlb
  633.             RenameFile stdole1$, "STDOLE.TLB"
  634.             'write to _mssetup.bat: rename tempfile2 to stdole.tlb
  635.             WriteLine DESTWIN$+"_MSSETUP.BAT", ""
  636.             WriteLine DESTWIN$+"_MSSETUP.BAT", "DEL "+DESTSYS$+"STDOLE.TLB"
  637.             WriteLine DESTWIN$+"_MSSETUP.BAT", "REN "+DESTSYS$+stdole2$+" STDOLE.TLB"
  638.     ENDIF
  639.     IF OLEINCLUDED% AND (OLE2_16% OR OLE2_32% OR OLE2AUTO_16%) THEN
  640.         IF OLE16RUNAPP% THEN
  641.             reg1$ = DESTWIN$ + GetTempFileAt(DESTWIN$, "REG")
  642.             CopyFile DESTWIN$+"REG.DAT", reg1$, cmoOverwrit, 0
  643.         ENDIF
  644.  
  645.         RUN "regedit /s " + DESTSYS$ + "ole2.reg"
  646.  
  647.         IF OLE16RUNAPP% THEN
  648.             reg2$ = GetTempFileAt(DESTWIN$, "REG")
  649.             RemoveFile DESTWIN$ + reg2$, cmoForce
  650.             RenameFile DESTWIN$ + "REG.DAT" , reg2$
  651.             'rename tempfile1 -> reg.dat
  652.             RenameFile reg1$, "REG.DAT"
  653.             'write to _mssetup.bat: rename tempfile2 to reg.dat
  654.             WriteLine DESTWIN$+"_MSSETUP.BAT", ""
  655.             WriteLine DESTWIN$+"_MSSETUP.BAT", "DEL "+DESTWIN$+"REG.DAT"
  656.             WriteLine DESTWIN$+"_MSSETUP.BAT", "REN "+DESTWIN$ + reg2$+" REG.DAT"
  657.             OLE_OLEBOOT% = 1
  658.         ENDIF
  659.     END IF
  660. END SUB
  661.  
  662. SUB UpdateSystemIni STATIC
  663.  
  664.     VxDPath$ = DEST32S$ + "W32S.386"
  665.     SystemIniPath$ = GetWindowsDir()
  666.  
  667.     t% = MakeSystemIni(SystemIniPath$, VxdPath$)
  668.  
  669. END SUB
  670.  
  671. FUNCTION RebootSystem(OLEONLY%) STATIC AS INTEGER
  672.  
  673. '   Check if any files were locked during install.  If the RestartList
  674. '   is not empty, ExitExecRestart() will restart Windows, cleanup setup
  675. '   files, and copy over locked files before Windows restarts.
  676.     i% = RestartListEmpty()
  677.     IF i% = 0 THEN
  678. '      ExitExecRestart() only returns if applications refuse to be shutdown.
  679. '      Win32s is installed but will not operate until Windows is restarted
  680. '      and the Win32s VxD is loaded.
  681.        i% = ExitExecRestart()
  682.        RebootSystem = 0
  683.     ELSE
  684. '      If the RestartList list is empty, it is necessary to restart windows
  685. '      directly.  The MSSETUP program creates _MSRSTRT.EXE and _MSSETUP.BAT
  686. '      in the restart directory.  This program should be exec'd to handle
  687. '      proper MSSETUP cleanup (temp files) and restart Windows.
  688.        IF (OLEONLY% = 1) THEN
  689.            RebootSystem = 1
  690.        ELSE
  691.            i% = ExitWindowsExec( GetWindowsDir() + "_MSRSTRT.EXE", "_MSSETUP.BAT" )
  692.            RebootSystem = 0
  693.        END IF
  694.     ENDIF
  695.  
  696. END FUNCTION
  697.  
  698.  
  699. '**
  700. '** Purpose:
  701. '**     Appends a file name to the end of a directory path,
  702. '**     inserting a backslash character as needed.
  703. '** Arguments:
  704. '**     szDir$  - full directory path (with optional ending "\")
  705. '**     szFile$ - filename to append to directory
  706. '** Returns:
  707. '**     Resulting fully qualified path name.
  708. '*************************************************************************
  709. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  710.     IF szDir$ = "" THEN
  711.     MakePath = szFile$
  712.     ELSEIF szFile$ = "" THEN
  713.     MakePath = szDir$
  714.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  715.     MakePath = szDir$ + szFile$
  716.     ELSE
  717.     MakePath = szDir$ + "\" + szFile$
  718.     END IF
  719. END FUNCTION
  720.  
  721. FUNCTION GetTempFileAt(szDir$, szPrefix$) STATIC AS STRING
  722.     szCurDir$ = CURDIR$
  723.     CHDIR szDir$ + "."
  724.     szTempFile$ = STRING$(144, "E")
  725.     i% = GetTempFileName(TF_FORCEDRIVE, szPrefix$,0, szTempFile$)
  726.     CHDIR szCurDir$
  727.     GetTempFileAt = MID$(szTempFile$,3)
  728. END FUNCTION
  729.  
  730. SUB RecoverFromCopy(szFileName$) STATIC
  731.     IF DoesFileExist(szFileName$, femExist) = 0 THEN
  732.         szBackFile$ = MID$(szFileName$, 1, LEN(szFileName$)-3) + VERNUM$
  733.         IF DoesfileExist(szBackFile$, femExist) = 0 THEN
  734.             i% = DoMsgBox("ERROR: Could not find backup file "+szBackfile$, "Setup Error", MB_ICONEXLAMATION + MB_OK)
  735.         ELSE
  736.             CopyFile szBackFile$, szFileName$, cmoTimeStamp, 0
  737.         END IF
  738.     END IF
  739. END SUB
  740.