home *** CD-ROM | disk | FTP | other *** search
/ Computer Buyer 1996 December / DKMMSAMP.iso / DKSETUP / WIN32S.INC < prev   
Text File  |  1996-03-20  |  24KB  |  654 lines

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