home *** CD-ROM | disk | FTP | other *** search
/ Collection of Education / collectionofeducationcarat1997.iso / SCIENCE / COFNET31.ZIP / OFNET.MST < prev    next >
Encoding:
Text File  |  1995-11-09  |  29.6 KB  |  892 lines

  1. '**************************************************************************
  2. '*                       MSSetup Toolkit Sample 1
  3. '**************************************************************************
  4.  
  5. '' $DEFINE DEBUG  ''Define for script development/debugging
  6.  
  7. '$INCLUDE 'setupapi.inc'
  8. '$INCLUDE 'msdetect.inc'
  9. '$INCLUDE 'msregdb.inc'
  10.  
  11. ''Dialog ID's
  12. CONST WELCOME       = 100
  13. CONST ASKQUIT       = 200
  14. CONST DESTPATH      = 300
  15. CONST EXITFAILURE   = 400
  16. CONST EXITQUIT      = 600
  17. CONST EXITSUCCESS   = 700
  18. CONST OPTIONS       = 800
  19. CONST BADPATH       = 6400
  20.  
  21. CONST HELPWELCOME   = 1000
  22. CONST HELPLICENSE    = 1001
  23. CONST VERPATH       = 1100
  24. CONST EXITFAILNOTWIN31 = 1200
  25. CONST EXITFAILNOTENH = 1300
  26. CONST EXITFAILNOTPAGING = 1325
  27. CONST EXITFAILNOTINTEL = 1350
  28. CONST EXITFAILRUNAPP           = 1360
  29. CONST CHEMDRAWPATH  = 1500
  30. CONST CDITEMSPATH  = 1501
  31. CONST HELPCHEMDRAW  = 1600
  32. CONST W32SMISSING = 1010
  33. CONST W32SOBSOLETE = 1011
  34. CONST W32SERROR1 = 1012
  35. CONST W32SERROR2 = 1013
  36. CONST W32SERROR3 = 1014
  37. CONST W32SPARTIAL = 1015
  38.  
  39. ''Bitmap ID
  40. CONST LOGO = 1
  41.  
  42. ''GetTempFileName flags
  43. CONST TF_FORCEDRIVE            = 128
  44.  
  45. GLOBAL DESTWIN$      ''Windows directory.
  46. GLOBAL DESTSYS$      ''Windows\System directory.
  47. GLOBAL DEST32S$      ''Windows\System\Win32s directory
  48. GLOBAL DESTCHEM$     ''CHEMOFFICE directory
  49. GLOBAL DESTCHEMDRAW$ ''CHEMOFFICE directory
  50. GLOBAL DESTCDITEMS$  ''CHEMDRAW directory
  51. GLOBAL DESTCHEM3D$   ''CHEMOFFICE directory
  52. GLOBAL DESTCHEM3DTPL$''CHEMOFFICE directory
  53. GLOBAL DESTCHEM3DTBL$''CHEMOFFICE directory
  54. GLOBAL DESTCHEM3DFLT$''CHEMOFFICE directory
  55. GLOBAL PROGNAME$     ''Full name of program
  56. GLOBAL PROGNAMECD$   ''Full name of program
  57. GLOBAL PROGNAME3D$   ''Full name of program
  58. GLOBAL OLE_PROTECT%  ''Indicates whether ole2 dlls were protected from being
  59.                      '' copied.
  60. GLOBAL OLE_OLEBOOT%
  61. GLOBAL VERNUM$       '' Win32s Version Number (i.e., for v1.25 VERNUM$="125"
  62. GLOBAL REASON%         '' Reason why Win3s is to be installed.
  63.  
  64. GLOBAL INSTALLER$        '' Which installer is this?
  65. GLOBAL PRODUCT$            '' ChemOffice, Chem3D, ChemDraw, ChemFinder
  66. GLOBAL PRODUCTCODE$     '' of, 3d, cd, cf
  67. GLOBAL LEVEL$            '' Pro, Std, Ltd, Net
  68. GLOBAL INSTALL3D%        '' nonzero if 3d or office
  69. GLOBAL INSTALLCD%        '' nonzero if cd or office
  70.  
  71. DECLARE SUB Install(OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%)
  72. DECLARE SUB RecoverFromCopy(szFileName$)
  73. DECLARE SUB UpdateSystemIni
  74. DECLARE FUNCTION RebootSystem(OLEONLY%) AS INTEGER
  75. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  76. DECLARE FUNCTION MakeSystemIni LIB "INIUPD.DLL" (arg1$, arg2$) AS INTEGER
  77. DECLARE FUNCTION RestartWindows LIB "INIUPD.DLL" AS INTEGER
  78. DECLARE FUNCTION OnWindowsNT LIB "INIUPD.DLL" AS INTEGER
  79. DECLARE FUNCTION PagingEnabled LIB "INIUPD.DLL" AS INTEGER
  80. DECLARE FUNCTION ShareEnabled LIB "INIUPD.DLL" AS INTEGER
  81. DECLARE FUNCTION IsWin32sLoaded LIB "INIUPD.DLL" (arg1$) AS INTEGER
  82. DECLARE FUNCTION IsRunningApp LIB "INIUPD.DLL" AS INTEGER
  83. DECLARE FUNCTION DoWinExec LIB "INIUPD.DLL" (arg1$) AS INTEGER
  84. DECLARE FUNCTION SetCuiFlags LIB "OFNETCUI.DLL" (arg1%, arg2%) AS INTEGER
  85. DECLARE FUNCTION ExitWindowsExec LIB "USER.EXE" (arg1$, arg2$) AS INTEGER
  86. DECLARE FUNCTION GetModuleHandle LIB "KRNL386.EXE" (arg1$) AS INTEGER
  87. DECLARE FUNCTION LoadLibrary LIB "KRNL386.EXE" (arg1$) AS INTEGER
  88. DECLARE SUB FreeLibrary LIB "KRNL386.EXE" (arg1%)
  89. DECLARE FUNCTION SetErrorMode LIB "KRNL386.EXE" (arg1%) AS INTEGER
  90.  
  91. DECLARE FUNCTION GetTempFileName LIB "KRNL386.EXE" (drive%, prefix$, u%, filename$) AS INTEGER
  92. DECLARE SUB WriteLine LIB "INIUPD.DLL" (filename$, text$)
  93. DECLARE FUNCTION GetTempFileAt(szDir$, szPrefix$) as string
  94.  
  95. INIT:
  96.     PRODUCT$ = "ChemOffice"      '' ChemOffice, Chem3D, ChemDraw, ChemFinder
  97.     PRODUCTCODE$ = "of"       '' of, 3d, cd, cf
  98.     LEVEL$ = "Net"              '' Pro, Std, Ltd, Net
  99.     INSTALL3D% = 1
  100.     INSTALLCD% = 1
  101.  
  102.     INSTALLER$ = PRODUCTCODE$ + LEVEL$
  103.        PROGNAME$ = "CS " + PRODUCT$ + " " + LEVEL$
  104.        PROGNAMECD$ = "CS ChemDraw " + LEVEL$
  105.        PROGNAME3D$ = "CS Chem3D " + LEVEL$
  106.        CUIDLL$ = INSTALLER$ + "CUI.DLL"            ''Custom user interface dll
  107.  
  108.     HELPPROC$ = "FHelpDlgProc"        ''Help dialog procedure
  109.     szOldVer$ ="1.00.000     "        ''Reserve space in string for version
  110.     WIN32ENABLED% = 0
  111.     WINDOWS31% = 0
  112.     OLEONLY% = 0
  113.     OLE2_16% = 0
  114.     OLE2AUTO_16% = 0
  115.     OLE16RUNAPP% = 0
  116.     OLE_PROTECT% = 0
  117.     OLE_OLEBOOT% = 0
  118.     ON ERROR GOTO ERRNORMAL
  119.  
  120.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  121.  
  122.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  123.     IF szInf$ = "" THEN
  124.     szInf$ = GetSymbolValue("STF_CWDDIR") + INSTALLER$ + ".inf"
  125.     END IF
  126.     ReadInfFile szInf$
  127.  
  128.     SetBitmap CUIDLL$, LOGO
  129.  
  130.     WIN32SVER$ = MID$(GetSectionKeyVersion("WindowsSystem", "win32s16"), 1, 4)
  131.     SetTitle PROGNAME$ + " Setup Program (Win32s " + WIN32SVER$ + ")"
  132.     VERNUM$ = MID$(WIN32SVER$, 1, 1) + MID$(WIN32SVER$, 3 , 2)
  133.  
  134.     DESTWIN$ = GetWindowsDir()
  135.     DESTSYS$ = GetWindowsSysDir()
  136.     DEST32S$ = DESTSYS + "WIN32S\"
  137.  
  138.     if Level$ = "Net" then
  139.         i% = DoWinExec("notepad " + SrcDir$ + "license.txt")
  140.  
  141. DOWELCOME:
  142.         sz$ = UIStartDlg(CUIDLL$, WELCOME, "FInfoDlgProc", HELPLICENSE, HELPPROC$)
  143.         UIPop 1
  144.         IF sz$ = "REACTIVATE" THEN
  145.             GOTO DOWELCOME
  146.         END IF
  147.         IF sz$ = "EXIT" THEN
  148.             GOSUB ASKQUIT
  149.             GOTO DOWELCOME
  150.         END IF
  151.     endif
  152.  
  153. '$IFDEF DEBUG
  154.     i% = SetSizeCheckMode(scmOnIgnore)    '' could use scmOff; def = scmOnFatal
  155.     WinDrive$ = MID$(GetWindowsDir, 1, 1)
  156.     IF IsDriveValid(WinDrive$) = 0 THEN
  157.     i% = DoMsgBox("Windows drive ('"+WinDrive$+"') is not a valid drive.", "DEBUG", MB_TASKMODAL+MB_ICONHAND+MB_OK)
  158.     GOTO QUIT
  159.     END IF
  160. '$ENDIF ''DEBUG
  161.  
  162. CHECK:
  163.     '' Can not run on versions less than 3.10.
  164.     IF GetWindowsMajorVersion < 3 THEN
  165.     ExitCode% = EXITFAILNOTWIN31
  166.     GOTO QUIT
  167.     END IF
  168.     IF GetWindowsMajorVersion = 3 AND GetWindowsMinorVersion < 10 THEN
  169.     ExitCode% = EXITFAILNOTWIN31
  170.     GOTO QUIT
  171.     END IF
  172.     '' Check that we are not runnig on Chicago, including pre-released
  173.     '' Chicago versions.
  174.     IF GetWindowsMajorVersion *100 + GetWindowsMinorVersion > 350 THEN
  175.     ExitCode% = EXITSUCCESS
  176.     WIN32ENABLED% = 1
  177.     GOTO CHEMDRAW
  178.     END IF
  179.     IF GetWindowsMode < 2  THEN
  180.     IF OnWindowsNT() THEN
  181.        ExitCode% = EXITFAILNOTINTEL    '' Running on Windows NT (on RISC)
  182.     ELSE
  183.        ExitCode% = EXITFAILNOTENH    '' Standard Mode Windows
  184.     END IF
  185.     GOTO QUIT
  186.     END IF
  187.     IF OnWindowsNT() THEN
  188.     ExitCode% = EXITSUCCESS
  189.     WIN32ENABLED% = 1
  190.     DESTSYS$ = DESTWIN$ + "SYSTEM32\"
  191.     GOTO CHEMDRAW
  192.     END IF
  193.     ExitCode% = EXITSUCCESS
  194.  
  195.     if IsRunningApp() <> 0 THEN
  196.         ExitCode% = EXITFAILRUNAPP
  197.         GOTO QUIT
  198.     END IF
  199.  
  200.     WINDOWS31% = 1
  201.  
  202.     '' Get version of Win32s to be installed from version info in INF file
  203.     szNewVer$ = GetSectionKeyVersion("WindowsSystem", "win32s16")
  204.  
  205.     '' See if OLE is included.
  206.  
  207.     OLEINCLUDED% = DoesFileExist( GetSymbolValue("STF_SRCDIR") + "OLE2THK.DL_", femExists )
  208.  
  209.     IF OLEINCLUDED% = 1 THEN
  210.         '' See whether one of the OLE 16 bit components is loaded.
  211.         IF GetModulehandle("compobj") <> 0 THEN
  212.             OLE16RUNAPP% = 1
  213.             GOTO GetOleVersion
  214.         END IF
  215.         IF GetModuleHandle("ole2") <> 0 THEN
  216.             OLE16RUNAPP% = 1
  217.             GOTO GetOleVersion
  218.         END IF
  219.         IF GetModuleHandle("ole2prox") <> 0 THEN
  220.             OLE16RUNAPP% = 1
  221.             GOTO GetOleVersion
  222.         END IF
  223.         IF GetModuleHandle("ole2conv") <> 0 THEN
  224.             OLE16RUNAPP% = 1
  225.             GOTO GetOleVersion
  226.         END IF
  227.         IF GetModuleHandle("storage") <> 0 THEN
  228.             OLE16RUNAPP% = 1
  229.             GOTO GetOleVersion
  230.         END IF
  231.         IF GetModuleHandle("ole2nls") <> 0 THEN
  232.             OLE16RUNAPP% = 1
  233.             GOTO GetOleVersion
  234.         END IF
  235.         IF GetModuleHandle("ole2disp") <> 0 THEN
  236.             OLE16RUNAPP% = 1
  237.             GOTO GetOleVersion
  238.         END IF
  239.         IF GetModuleHandle("typelib") <> 0 THEN
  240.             OLE16RUNAPP% = 1
  241.             GOTO GetOleVersion
  242.         END IF
  243.  
  244. GetOleVersion:
  245.         szOleNewVer$ = GetSectionKeyVersion("OleWindowsSystemWin32s", "ole2thk")
  246.  
  247.         '' Get version of currently installed OLE32 from version info of
  248.         '' ole2thk file
  249.         szOleOldVer$ = GetVersionOfFile( DESTSYS$ + "WIN32S\OLE2THK.DLL" )
  250.  
  251.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "COMPOBJ.DLL" )
  252.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "compobj")
  253.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  254.             OLE2_16% = 1
  255.         END IF
  256.  
  257.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2.DLL" )
  258.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2")
  259.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  260.             OLE2_16% = 1
  261.         END IF
  262.  
  263.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2PROX.DLL" )
  264.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2prox")
  265.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  266.             OLE2_16% = 1
  267.         END IF
  268.  
  269.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "STORAGE.DLL" )
  270.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "storage")
  271.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  272.             OLE2_16% = 1
  273.         END IF
  274.  
  275.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2CONV.DLL" )
  276.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2conv")
  277.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  278.             OLE2_16% = 1
  279.         END IF
  280.  
  281.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2NLS.DLL" )
  282.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2nls")
  283.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  284.             OLE2AUTO_16% = 1
  285.         END IF
  286.  
  287.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "OLE2DISP.DLL" )
  288.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "ole2disp")
  289.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  290.             OLE2AUTO_16% = 1
  291.         END IF
  292.  
  293.         szOle16OldVer$ = GetVersionOfFile( DESTSYS$ + "TYPELIB.DLL" )
  294.         szOle16NewVer$ = GetSectionKeyVersion("OleWindowsSystem", "typelib")
  295.         IF (szOle16NewVer$ > szOle16OldVer$) THEN
  296.             OLE2AUTO_16% = 1
  297.         END IF
  298.  
  299.     END IF
  300.  
  301.     OLE2_32% = OLEINCLUDED%
  302.  
  303.     '' Check if Win32s is partially installed
  304.     sz$ = GetIniKeyString (DESTSYS$ + "WIN32S.INI", "Win32s", "Setup")
  305.     '' If WIN32S.INI specifies Setup=0, then force complete Win32s file overwrite
  306.     IF sz$ = "0" THEN
  307.     REASON%=W32SPARTIAL
  308.     GOTO WELCOME
  309.     END IF
  310.     '' If WIN32S.INI is missing, try and reinstall Win32s files/recreate WIN32S.INI
  311.     IF sz$ <> "1" THEN
  312.         REASON%=W32SMISSING
  313.         GOTO WELCOME
  314.     END IF
  315.  
  316.     '' If Win32s is already installed, get running version number
  317.     i% = DoesFileExist( DESTSYS$ + "W32SYS.DLL", femExists )
  318.     IF i% = 0 THEN
  319.         REASON%=W32SERROR1
  320.         GOTO WELCOME
  321.     ENDIF
  322.  
  323.     i% = IsWin32sLoaded( szOldVer$ )
  324.  
  325.     IF i% = 1 THEN
  326.         REASON%=W32SERROR2
  327.         GOTO WELCOME
  328.     ENDIF
  329.  
  330.     IF i% = 2 THEN
  331.         REASON%=W32SERROR3
  332.         GOTO WELCOME
  333.     ENDIF
  334.  
  335.     IF szNewVer$ > szOldVer$ THEN
  336.         REASON%=W32SOBSOLETE
  337.         GOTO WELCOME
  338.     END IF
  339.  
  340.     IF OLEINCLUDED% = 1 THEN
  341.  
  342.         OLE2_32% = 0
  343.  
  344.         IF szNewVer$ = szOldVer$ THEN
  345.             '' Compare OLE32 version and versions of each of OLE16 libraries.
  346.             sz$ = GetIniKeyString (DESTSYS$ + "WIN32S.INI", "OLE", "Setup")
  347.             '' If WIN32S.INI specifies OLE2 Setup=0, then force OLE2 file overwrite
  348.             IF ((sz$ <> "1") OR (szOleNewVer$ > szOleOldVer$)) THEN
  349.                 OLEONLY% = 1
  350.                 OLE2_32% = 1
  351.                 GOTO WELCOME
  352.             END IF
  353.  
  354.             IF OLE2_16% OR OLE2AUTO_16 THEN
  355.                 OLEONLY% = 1
  356.                 GOTO WELCOME
  357.             END IF
  358.  
  359.         END IF
  360.  
  361.     END IF
  362.  
  363.     WIN32ENABLED% = 1
  364.     GOTO CHEMDRAW
  365.  
  366. WELCOME:
  367.     i% = SetCuiFlags(OLEONLY%, OLE16RUNAPP%)
  368.     sz$ = UIStartDlg(CUIDLL$, REASON%, "FInfoDlgProc", HELPWELCOME, HELPPROC$)
  369.     UIPop 1
  370.     IF sz$ = "BACK" THEN
  371.         WIN32ENABLED% = 1
  372.         GOTO CHEMDRAW
  373.     END IF
  374.     IF sz$ <> "CONTINUE" THEN
  375.         GOSUB ASKQUIT
  376.         GOTO WELCOME
  377.     END IF
  378.  
  379.  
  380. GETWIN32SPATH:
  381.     IF PagingEnabled() = 0 THEN
  382.     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)
  383.     ExitCode% = EXITFAILURE '' Enhanced mode but not paging
  384.     GOTO QUIT
  385.     END IF
  386.  
  387.     IF ShareEnabled() = 0 THEN
  388.     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)
  389.     END IF
  390.  
  391.     SetSymbolValue "EditTextIn", DESTSYS$
  392.     SetSymbolValue "EditFocus", "END"
  393.  
  394. GETPATHL1:
  395.     sz$ = UIStartDlg(CUIDLL$, VERPATH, "FDispDlgProc", HELPWELCOME, HELPPROC$)
  396.  
  397.     IF sz$ = "CONTINUE" THEN
  398.     IF IsDirWritable(DESTSYS$) = 0 THEN
  399.         GOSUB BADPATH
  400.         GOTO GETPATHL1
  401.     END IF
  402.     UIPop 1
  403.     ELSEIF sz$ = "REACTIVATE" THEN
  404.         UIPop 1
  405.     GOTO GETPATHL1
  406.     ELSEIF sz$ = "BACK" THEN
  407.     UIPop 1
  408.     GOTO WELCOME
  409.     ELSE
  410.         UIPop 1
  411.     GOSUB ASKQUIT
  412.     GOTO GETPATHL1
  413.     END IF
  414.  
  415. COPYFILES:
  416.     IF OLEONLY% = 0 THEN
  417.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Setup", "0", cmoOverwrite
  418.     END IF
  419.     IF OLE2_32% = 1 THEN
  420.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Setup", "0", cmoOverwrite
  421.     END IF
  422.  
  423.     '' Indicate Win32s install failure until all files known to be copied.
  424.     ExitCode% = EXITFAILURE
  425.     ERR = 0
  426.     CreateDir DEST32S$, cmoNone
  427.     Install OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%
  428.     UpdateSystemIni
  429.     '' Terminate if unhandled fatal error
  430.     IF ERR <> 0 THEN
  431.     GOTO QUIT
  432.     END IF
  433.  
  434.     IF OLEONLY% = 0 THEN
  435.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Setup", "1", cmoOverwrite
  436.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Version", szNewVer$, cmoOverwrite
  437.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Nls", "AnsiCP", "1252", cmoOverwrite
  438.     END IF
  439.     IF OLE2_32% = 1 THEN
  440.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Setup", "1", cmoOverwrite
  441.         CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Version", szOleNewVer, cmoOverwrite
  442.     END IF
  443.  
  444.     i% = DoMsgBox("Win32s files successfully installed.", PROGNAME$ + " Setup", MB_OK+MB_TASKMODAL)
  445.     '' Indicate Win32s correctly copied and installed.
  446.     ExitCode% = EXITSUCCESS
  447.  
  448. CHEMDRAW:
  449.     IF OLEONLY% = 1 THEN
  450.         GOTO QUIT
  451.     ENDIF
  452. ''    IF WIN32ENABLED% = 1 THEN
  453. ''    sz$ = UIStartDlg(CUIDLL$, CHEMDRAWINSTNOWIN32S, "FInfoDlgProc",0, "")
  454. ''    ELSE
  455. ''    sz$ = UIStartDlg(CUIDLL$, CHEMDRAWINST, "FInfoDlgProc",0, "")
  456. ''    END IF
  457. ''    UIPop 1
  458. ''    IF sz$ <> "CONTINUE" THEN
  459. ''    GOTO QUIT
  460. ''    END IF
  461.  
  462. GETCHEMPATH:
  463.     DESTCHEM$ = MID$(DESTSYS$,1,3) + "WIN32APP\CHMOFFCE\"
  464.     SetSymbolValue "EditTextIn", DESTCHEM$
  465.     SetSymbolValue "EditFocus", "END"
  466.  
  467. GETCHEMPATHL1:
  468.     sz$ = UIStartDlg(CUIDLL$, CHEMDRAWPATH, "FEditDlgProc", HELPCHEMDRAW, HELPPROC$)
  469.  
  470.     IF sz$ = "CONTINUE" THEN
  471.     DESTCHEM$ = GetSymbolValue("EditTextOut")
  472.  
  473.     IF MID$(DESTCHEM$, LEN(DESTCHEM$), 1) <> "\" THEN
  474.         DESTCHEM$ = DESTCHEM$ + "\"
  475.     END IF
  476.     ''Validate new path.
  477.     IF IsDirWritable(DESTCHEM$) = 0 THEN
  478.         GOSUB BADPATH
  479.         GOTO GETCHEMPATHL1
  480.     END IF
  481.     UIPop 1
  482.  
  483.     GOTO GETITEMSPATH
  484.     ELSEIF sz$ = "REACTIVATE" THEN
  485.     GOTO GETCHEMPATHL1
  486.     ELSEIF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
  487.     UIPop 1
  488.     GOTO QUIT
  489.     END IF
  490.  
  491. GETITEMSPATH:
  492.     DESTCHEMDRAW$ = DESTCHEM$ + "CHEMDRAW\"
  493.     DESTCDITEMS$ = DESTCHEMDRAW$ + "CD_ITEMS\"
  494.     SetSymbolValue "EditTextIn", DESTCDITEMS$
  495.     SetSymbolValue "EditFocus", "END"
  496.  
  497. GETITEMSPATHL1:
  498.     sz$ = UIStartDlg(CUIDLL$, CDITEMSPATH, "FEditDlgProc", HELPCHEMDRAW, HELPPROC$)
  499.  
  500.     IF sz$ = "CONTINUE" THEN
  501.     DESTCDITEMS$ = GetSymbolValue("EditTextOut")
  502.  
  503.     IF MID$(DESTCDITEMS$, LEN(DESTCDITEMS$), 1) <> "\" THEN
  504.         DESTCDITEMS$ = DESTCDITEMS$ + "\"
  505.     END IF
  506.     ''Validate new path.
  507.     IF IsDirWritable(DESTCDITEMS$) = 0 THEN
  508.         GOSUB BADPATH
  509.         GOTO GETITEMSPATHL1
  510.     END IF
  511.     UIPop 1
  512.  
  513.     GOTO COPYCHEMDRAW
  514.     ELSEIF sz$ = "REACTIVATE" THEN
  515.     GOTO GETITEMSPATHL1
  516.     ELSEIF sz$ = "EXIT" THEN
  517.     UIPop 1
  518.     GOTO QUIT
  519.     ELSEIF sz$ = "CANCEL" THEN
  520.     UIPop 1
  521.     SetSymbolValue "EditTextIn", DESTCHEM$
  522.     SetSymbolValue "EditFocus", "END"
  523.     GOTO GETCHEMPATHL1
  524.     END IF
  525.  
  526. COPYCHEMDRAW:
  527.     DESTCHEM3D$ = DESTCHEM$ + "CHEM3D\"
  528.     DESTCHEM3DTPL$ = DESTCHEM3D$ + "C3DTMPLT\"
  529.     DESTCHEM3DTBL$ = DESTCHEM3D$ + "C3DTABLE\"
  530.     DESTCHEM3DFLT$ = DESTCHEM3D$ + "C3DFILTR\"
  531.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  532.     ClearCopyList
  533.     CreateDir DESTCHEM$, cmoNone
  534.     if INSTALL3D% then
  535.         CreateDir DESTCHEM3D$, cmoNone
  536.         CreateDir DESTCHEM3DTPL$, cmoNone
  537.         CreateDir DESTCHEM3DTBL$, cmoNone
  538.         CreateDir DESTCHEM3DFLT$, cmoNone
  539.         ERR = 0
  540.         AddSectionFilesToCopyList "Win32appChem3D", SrcDir$, DESTCHEM3D$
  541.         AddSectionFilesToCopyList "Chem3DTemplates", SrcDir$, DESTCHEM3DTPL$
  542.         AddSectionFilesToCopyList "Chem3DTables", SrcDir$, DESTCHEM3DTBL$
  543.         AddSectionFilesToCopyList "Chem3DFilters", SrcDir$, DESTCHEM3DFLT$
  544.     endif
  545.     if INSTALLCD% then
  546.         CreateDir DESTCHEMDRAW$, cmoNone
  547.         CreateDir DESTCDITEMS$, cmoNone
  548.         ERR = 0
  549.         AddSectionFilesToCopyList "Win32appChemDraw", SrcDir$, DESTCHEMDRAW$
  550.         AddSectionFilesToCopyList "CDItems", SrcDir$, DESTCDITEMS$
  551.     endif
  552.  
  553.     if WINDOWS31% = 0 then
  554.         if OnWindowsNT() then
  555.             AddSectionFilesToCopyList "DLLS32", SrcDir$, DESTSYS$
  556.         end if
  557.     else
  558.         AddSectionFilesToCopyList "DLLS16", SrcDir$, DESTSYS$
  559.     endif
  560.  
  561.     CopyFilesInCopyList
  562.     IF ERR <> 0 THEN
  563.     GOTO QUIT
  564.     END IF
  565.     
  566.     ERR = 0
  567.     CreateProgmanGroup "CS ChemOffice", "", cmoNone
  568.     ShowProgmanGroup   "CS ChemOffice", 1, cmoNone
  569.  
  570.     if INSTALLCD% then
  571.         ERR = 0
  572.         if LEVEL$ <> "Net" then
  573.             CreateIniKeyValue "WIN.INI", "ChemDraw", "CD_ITEMS_PATH", DESTCDITEMS$, cmoOverwrite
  574.         endif
  575.  
  576.         CreateRegKeyValue ".chm", "chemdrawfile"
  577.         CreateRegKeyValue ".cds", "chemdrawfile"
  578.         CreateRegKeyValue ".cts", "chemdrawfile"
  579.         CreateRegKeyValue ".ctp", "chemdrawfile"
  580.         CreateRegKeyValue "chemdrawfile", "ChemDraw File"
  581.         CreateRegKeyValue "chemdrawfile\shell\print\command", DESTCHEMDRAW$ + "ChemDraw.exe /p %1"
  582.         CreateRegKeyValue "chemdrawfile\shell\open\command", DESTCHEMDRAW$ + "ChemDraw.exe %1"
  583.  
  584.         CreateProgmanItem  "CS ChemOffice", PROGNAMECD$, DESTCHEMDRAW$ + "ChemDraw.EXE", "", cmoOverwrite
  585.         CreateProgmanItem  "CS ChemOffice", PROGNAMECD$ + " Help", DESTCHEMDRAW$ + "ChemDraw.HLP", "", cmoOverwrite
  586.         CreateProgmanItem  "CS ChemOffice", PROGNAMECD$ + " Readme", DESTCHEMDRAW$ + "ReadmeCD.TXT", "", cmoOverwrite
  587.         'CreateProgmanItem  "CS ChemOffice", PROGNAMECD$ + " Tutorial", DESTCHEMDRAW$ + "GETSTART.HLP", "", cmoOverwrite
  588.         'CreateProgmanItem  "CS ChemOffice", "What's New in 3.5", DESTCHEMDRAW$ + "NEW35.HLP", "", cmoOverwrite
  589.     endif
  590.  
  591.     if INSTALL3D% then
  592.         CreateProgmanItem  "CS ChemOffice", PROGNAME3D$, DESTCHEM3D$ + "Chem3D.EXE", "", cmoOverwrite
  593.         CreateProgmanItem  "CS ChemOffice", PROGNAME3D$ + " Help",   DESTCHEM3D$ + "Chem3D.HLP", "", cmoOverwrite
  594.         CreateProgmanItem  "CS ChemOffice", PROGNAME3D$ + " Readme", DESTCHEM3D$ + "Readme3D.TXT", "", cmoOverwrite
  595.         if LEVEL$ = "Pro" then
  596.             CreateProgmanItem  "CS ChemOffice", "CS Table Editor", DESTCHEM3D$ + "TBLEDIT.EXE", "", cmoOverwrite
  597.         endif
  598.     endif
  599.  
  600.     '' Only put up success dialog if icon added to group
  601.     IF ERR = 0 THEN
  602.     i% = DoMsgBox(PROGNAME$ + " was successfully installed.", PROGNAME$ + " Setup", MB_OK+MB_TASKMODAL)
  603.     END IF
  604.     ERR = 0
  605.  
  606. QUIT:
  607.     '' Install error handler for final message box routines
  608.     ON ERROR GOTO ERRQUIT
  609.     IF ERR = 0 THEN
  610.     dlg% = ExitCode%
  611.     ELSEIF ERR = STFQUIT THEN
  612.         IF (OLE_PROTECT% = 1) THEN
  613.             '' Free all previously loaded libraries
  614.             FreeLibrary GetModuleHandle("compobj")
  615.             FreeLibrary GetModuleHandle("ole2")
  616.             FreeLibrary GetModuleHandle("ole2prox")
  617.             FreeLibrary GetModuleHandle("ole2conv")
  618.             FreeLibrary GetModuleHandle("storage")
  619.             FreeLibrary GetModuleHandle("ole2nls")
  620.             FreeLibrary GetModuleHandle("ole2disp")
  621.             FreeLibrary GetModuleHandle("typelib")
  622.         END IF
  623.     dlg% = EXITQUIT
  624.     ExitCode% = EXITQUIT
  625.     ELSE
  626.     dlg% = EXITFAILURE
  627.     ExitCode% = EXITQUIT
  628.     END IF
  629.  
  630. QUITL1:
  631.     IF WIN32ENABLED% = 1 THEN
  632.     UIPop 1
  633.     END
  634.     END IF
  635.  
  636.     sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfo0DlgProc", 0, "")
  637.     IF sz$ = "REACTIVATE" THEN
  638.     GOTO QUITL1
  639.     END IF
  640.     UIPop 1
  641.  
  642.     IF ExitCode% = EXITSUCCESS THEN
  643.         IF RebootSystem(OLEONLY% and not OLE_OLEBOOT%) = 0 THEN
  644.             CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "Win32s", "Setup", "0", cmoOverwrite
  645.             IF OLE2_32% = 1 THEN
  646.                 CreateIniKeyValue DESTSYS$ + "WIN32S.INI", "OLE", "Setup", "0", cmoOverwrite
  647.             END IF
  648.             i% = DoMsgBox("Win32s is not properly configured and Win32s Setup must be run again.", "Unable to Restart Windows", MB_ICONEXCLAMATION+MB_OK+MB_TASKMODAL)
  649.         END IF
  650.     ENDIF
  651.  
  652.     END
  653.  
  654. '' Fatal error handler for error message routine
  655. ERRQUIT:
  656.     i% = DoMsgBox("Setup sources were corrupted!", "Setup Message", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  657.     END
  658.  
  659. '' Bypass run-time errors. Let final dialog box display fatal error message.
  660. ERRNORMAL:
  661.     '' Check if user cancelled setup
  662.     IF ERR = STFQUIT THEN
  663.     GOTO QUIT
  664.     END IF
  665.     RESUME NEXT
  666.  
  667.  
  668. BADPATH:
  669.     sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfo0DlgProc", 0, "")
  670.     IF sz$ = "REACTIVATE" THEN
  671.     GOTO BADPATH
  672.     END IF
  673.     UIPop 1
  674.     RETURN
  675.  
  676.   ASKQUIT:
  677.     sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
  678.  
  679.     IF sz$ = "EXIT" THEN
  680.         UIPop 1
  681.     UIPopAll
  682.     ERROR STFQUIT
  683.     ELSEIF sz$ = "REACTIVATE" THEN
  684.     GOTO ASKQUIT
  685.     ELSE
  686.     UIPop 1
  687.     END IF
  688.     RETURN
  689.  
  690.  
  691.  
  692. '**
  693. '** Purpose:
  694. '**     Builds the copy list and performs all installation operations.
  695. '** Arguments:
  696. '**     none.
  697. '** Returns:
  698. '**     none.
  699. '*************************************************************************
  700. SUB Install(OLEONLY%, OLE2_32%, OLE2_16%, OLE2AUTO_16%, OLE16RUNAPP%) STATIC
  701.  
  702.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  703.  
  704.     '' Use file layout sections that specify OLDER file version/time check
  705.     IF OLEONLY% = 0 THEN
  706.     '' Add obsolete files to be removed
  707.     AddSectionFilesToCopyList "SystemObsoleteFiles", SrcDir$, DESTSYS$
  708.     AddSectionFilesToCopyList "Win32sSystemObsoleteFiles", SrcDir$, DESTSYS$ + "WIN32S\"
  709.     CopyFilesInCopyList
  710.  
  711.     '' Use file layout sections that specify ALWAYS overwrite files
  712.     AddSectionFilesToCopyList "WindowsSystem", SrcDir$, DESTSYS$
  713.     AddSectionFilesToCopyList "WindowsSystemWin32s", SrcDir$, DESTSYS$ + "WIN32S\"
  714.     END IF
  715.  
  716.     OLE_PROTECT% = 0
  717.     OLEINCLUDED% = DoesFileExist( GetSymbolValue("STF_SRCDIR") + "OLE2THK.DL_", femExists )
  718.     if OLEINCLUDED% = 1 THEN
  719.         IF (OLE2_16% = 1) OR (OLE2AUTO_16% = 1) THEN
  720.             IF OLE16RUNAPP% = 1 THEN
  721.                 '' Force all OLE2 DLLS to be copied during reboot.
  722.                 i% = SetErrorMode(-32768)
  723.                 i% = LoadLibrary(DESTSYS$ + "compobj.dll")
  724.                 i% = LoadLibrary(DESTSYS$ + "ole2.dll")
  725.                 i% = LoadLibrary(DESTSYS$ + "ole2prox.dll")
  726.                 i% = LoadLibrary(DESTSYS$ + "ole2conv.dll")
  727.                 i% = LoadLibrary(DESTSYS$ + "storage.dll")
  728.                 i% = LoadLibrary(DESTSYS$ + "ole2nls.dll")
  729.                 i% = LoadLibrary(DESTSYS$ + "ole2disp.dll")
  730.                 i% = LoadLibrary(DESTSYS$ + "typelib.dll")
  731.                 OLE_PROTECT% = 1
  732.             END IF
  733.             AddSectionFilesToCopyList "OleWindowsSystem", SrcDir$, DESTSYS$
  734.         END IF
  735.         IF OLE2_32% = 1 THEN
  736.             AddSectionFilesToCopyList "OleWindowsSystemWin32s", SrcDir$, DESTSYS$ + "WIN32S\"
  737.         END IF
  738.         IF (OLE2_16% = 1) OR (OLE2_32% = 1) OR (OLE2AUTO_16% = 1) THEN
  739.             AddSectionFilesToCopyList "Ole2RegWindowsSystem", SrcDir$, DESTSYS$
  740.         END IF
  741.         IF (OLE2AUTO_16% = 1) THEN
  742.             AddSectionFilesToCopyList "StdoleWindowsSystem", SrcDir$, DESTSYS$
  743.             IF (OLE16RUNAPP and DoesFileExist(DESTSYS$ + "stdole.tlb", femExists) ) THEN
  744.                 ' copy stdole.tlb -> tempfile1
  745.                 stdole1$ = DESTSYS$ + GetTempFileAt(DESTSYS$, "STD")
  746.                 CopyFile DESTSYS$+"STDOLE.TLB", stdole1$, cmoOverwrit, 0
  747.                 OLE_OLEBOOT% = 1
  748.             ENDIF
  749.         END IF
  750.     END IF
  751.  
  752.     SetRestartDir GetWindowsDir()
  753.  
  754.     CopyFilesInCopyList
  755.  
  756.     IF (OLEINCLUDED% = 1) THEN
  757.         RecoverFromCopy DESTSYS$ + "compobj.dll"
  758.         RecoverFromCopy DESTSYS$ + "ole2.dll"
  759.         RecoverFromCopy DESTSYS$ + "ole2prox.dll"
  760.         RecoverFromCopy DESTSYS$ + "ole2conv.dll"
  761.         RecoverFromCopy DESTSYS$ + "storage.dll"
  762.         RecoverFromCopy DESTSYS$ + "ole2nls.dll"
  763.         RecoverFromCopy DESTSYS$ + "ole2disp.dll"
  764.         RecoverFromCopy DESTSYS$ + "typelib.dll"
  765.     END IF
  766.  
  767.     IF (OLE_PROTECT% = 1) THEN
  768.         '' Free all previously loaded libraries
  769.         FreeLibrary GetModuleHandle("compobj")
  770.         FreeLibrary GetModuleHandle("ole2")
  771.         FreeLibrary GetModuleHandle("ole2prox")
  772.         FreeLibrary GetModuleHandle("ole2conv")
  773.         FreeLibrary GetModuleHandle("storage")
  774.         FreeLibrary GetModuleHandle("ole2nls")
  775.         FreeLibrary GetModuleHandle("ole2disp")
  776.         FreeLibrary GetModuleHandle("typelib")
  777.         OLE_PROTECT% = 0
  778.     END IF
  779.     IF (OLE_OLEBOOT% = 1) THEN
  780.             'rename new stdole.tlb -> tempfile2
  781.             stdole2$ = GetTempFileAt(DESTSYS$, "STD")
  782.             RemoveFile DESTSYS$+stdole2$, cmoForce
  783.             RenameFile DESTSYS$+"STDOLE.TLB" , stdole2$
  784.             'rename tempfile1 -> stdole.tlb
  785.             RenameFile stdole1$, "STDOLE.TLB"
  786.             'write to _mssetup.bat: rename tempfile2 to stdole.tlb
  787.             WriteLine DESTWIN$+"_MSSETUP.BAT", ""
  788.             WriteLine DESTWIN$+"_MSSETUP.BAT", "DEL "+DESTSYS$+"STDOLE.TLB"
  789.             WriteLine DESTWIN$+"_MSSETUP.BAT", "REN "+DESTSYS$+stdole2$+" STDOLE.TLB"
  790.     ENDIF
  791.     IF OLEINCLUDED% AND (OLE2_16% OR OLE2_32% OR OLE2AUTO_16%) THEN
  792.         IF OLE16RUNAPP% THEN
  793.             reg1$ = DESTWIN$ + GetTempFileAt(DESTWIN$, "REG")
  794.             CopyFile DESTWIN$+"REG.DAT", reg1$, cmoOverwrit, 0
  795.         ENDIF
  796.  
  797.         RUN "regedit /s " + DESTSYS$ + "ole2.reg"
  798.  
  799.         IF OLE16RUNAPP% THEN
  800.             reg2$ = GetTempFileAt(DESTWIN$, "REG")
  801.             RemoveFile DESTWIN$ + reg2$, cmoForce
  802.             RenameFile DESTWIN$ + "REG.DAT" , reg2$
  803.             'rename tempfile1 -> reg.dat
  804.             RenameFile reg1$, "REG.DAT"
  805.             'write to _mssetup.bat: rename tempfile2 to reg.dat
  806.             WriteLine DESTWIN$+"_MSSETUP.BAT", ""
  807.             WriteLine DESTWIN$+"_MSSETUP.BAT", "DEL "+DESTWIN$+"REG.DAT"
  808.             WriteLine DESTWIN$+"_MSSETUP.BAT", "REN "+DESTWIN$ + reg2$+" REG.DAT"
  809.             OLE_OLEBOOT% = 1
  810.         ENDIF
  811.     END IF
  812. END SUB
  813.  
  814. SUB UpdateSystemIni STATIC
  815.  
  816.     VxDPath$ = DEST32S$ + "W32S.386"
  817.     SystemIniPath$ = GetWindowsDir()
  818.  
  819.     t% = MakeSystemIni(SystemIniPath$, VxdPath$)
  820.  
  821. END SUB
  822.  
  823. FUNCTION RebootSystem(OLEONLY%) STATIC AS INTEGER
  824.  
  825. '   Check if any files were locked during install.  If the RestartList
  826. '   is not empty, ExitExecRestart() will restart Windows, cleanup setup
  827. '   files, and copy over locked files before Windows restarts.
  828.     i% = RestartListEmpty()
  829.     IF i% = 0 THEN
  830. '      ExitExecRestart() only returns if applications refuse to be shutdown.
  831. '      Win32s is installed but will not operate until Windows is restarted
  832. '      and the Win32s VxD is loaded.
  833.        i% = ExitExecRestart()
  834.        RebootSystem = 0
  835.     ELSE
  836. '      If the RestartList list is empty, it is necessary to restart windows
  837. '      directly.  The MSSETUP program creates _MSRSTRT.EXE and _MSSETUP.BAT
  838. '      in the restart directory.  This program should be exec'd to handle
  839. '      proper MSSETUP cleanup (temp files) and restart Windows.
  840.        IF (OLEONLY% = 1) THEN
  841.            RebootSystem = 1
  842.        ELSE
  843.            i% = ExitWindowsExec( GetWindowsDir() + "_MSRSTRT.EXE", "_MSSETUP.BAT" )
  844.            RebootSystem = 0
  845.        END IF
  846.     ENDIF
  847.  
  848. END FUNCTION
  849.  
  850.  
  851. '**
  852. '** Purpose:
  853. '**     Appends a file name to the end of a directory path,
  854. '**     inserting a backslash character as needed.
  855. '** Arguments:
  856. '**     szDir$  - full directory path (with optional ending "\")
  857. '**     szFile$ - filename to append to directory
  858. '** Returns:
  859. '**     Resulting fully qualified path name.
  860. '*************************************************************************
  861. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  862.     IF szDir$ = "" THEN
  863.     MakePath = szFile$
  864.     ELSEIF szFile$ = "" THEN
  865.     MakePath = szDir$
  866.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  867.     MakePath = szDir$ + szFile$
  868.     ELSE
  869.     MakePath = szDir$ + "\" + szFile$
  870.     END IF
  871. END FUNCTION
  872.  
  873. FUNCTION GetTempFileAt(szDir$, szPrefix$) STATIC AS STRING
  874.     szCurDir$ = CURDIR$
  875.     CHDIR szDir$ + "."
  876.     szTempFile$ = STRING$(144, "E")
  877.     i% = GetTempFileName(TF_FORCEDRIVE, szPrefix$,0, szTempFile$)
  878.     CHDIR szCurDir$
  879.     GetTempFileAt = MID$(szTempFile$,3)
  880. END FUNCTION
  881.  
  882. SUB RecoverFromCopy(szFileName$) STATIC
  883.     IF DoesFileExist(szFileName$, femExist) = 0 THEN
  884.         szBackFile$ = MID$(szFileName$, 1, LEN(szFileName$)-3) + VERNUM$
  885.         IF DoesfileExist(szBackFile$, femExist) = 0 THEN
  886.             i% = DoMsgBox("ERROR: Could not find backup file "+szBackfile$, "Setup Error", MB_ICONEXLAMATION + MB_OK)
  887.         ELSE
  888.             CopyFile szBackFile$, szFileName$, cmoTimeStamp, 0
  889.         END IF
  890.     END IF
  891. END SUB
  892.