home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / 32sinst.mst < prev    next >
Text File  |  1994-09-03  |  22KB  |  646 lines

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