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