VBSQL.MST
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:17k
源码类别:

Windows编程

开发平台:

Visual C++

  1. ''***************************************************************
  2. ''* This is the setup script for the Visual Basic Library for SQL Server
  3. ''*
  4. ''* Modification History
  5. ''*
  6. ''* Trish Millines-9/16/92- Upgraded to version 2.0 of Setup
  7. ''* Ben Wilk -8/18/93- Upgraded to release for VB 3.0
  8. ''***************************************************************
  9. '$DEFINE DEBUG  ''Define for script development/debugging
  10. '$INCLUDE 'setupapi.inc'
  11. '$INCLUDE 'msdetect.inc'
  12. '$INCLUDE 'mscpydis.inc'    ''System
  13. ''Dialog ID's
  14. CONST WELCOME       = 100
  15. CONST ASKQUIT       = 200
  16. CONST DESTPATH      = 300
  17. CONST EXITFAILURE   = 400
  18. CONST EXITQUIT      = 600
  19. CONST EXITSUCCESS   = 700
  20. CONST OPTIONS       = 800
  21. CONST CUSTHELP     = 1000
  22. CONST WELCOMEHELP   = 1200
  23. CONST PATHHELP     = 1100
  24. CONST NOSELECTION   = 1300
  25. CONST CUSTINST     = 6200
  26. CONST TOOBIG     = 6300
  27. CONST BADPATH       = 6400
  28. CONST BILLBOARD     = 4545
  29. CONST WM_SYSCOMMAND = 274
  30. CONST SC_MAXIMIZE = 61488
  31. ''Bitmap ID
  32. CONST LOGO = 1
  33. ''File Types
  34. CONST LIBFILES    = 1   ''Library files
  35. CONST EXAMPLEFILES = 2   ''Example files
  36. CONST HELPFILES    = 3   ''VBSql Help files
  37. GLOBAL DEST$     ''Default destination directory.
  38. GLOBAL WINDRIVE$    ''Windows drive letter.
  39. GLOBAL WINDOWSDIR$  ''Windows directory
  40. ''CustInst list symbol names
  41. GLOBAL LIBNEEDS$      ''Library needs
  42. GLOBAL EXAMPLENEEDS$   '' Example needs
  43. GLOBAL HELPNEEDS$   ''Help needs
  44. GLOBAL EXTRACOSTS$    ''List of extra costs to add per drive
  45. GLOBAL BIGLIST$       ''List of option files cost calc results (boolean)
  46. ''Dialog list symbol names
  47. GLOBAL CHECKSTATES$
  48. GLOBAL STATUSTEXT$
  49. GLOBAL DRIVETEXT$
  50. DECLARE SUB AddOptFilesToCopyList (ftype%)
  51. DECLARE SUB RecalcOptFiles (ftype%)
  52. DECLARE SUB RecalcPath
  53. DECLARE SUB SetDriveStatus
  54. DECLARE SUB SetProcStatus
  55. DECLARE SUB SetWinStatus
  56. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  57. DECLARE FUNCTION BitmapCntrlInit LIB "mscuistf.dll" as INTEGER
  58. DECLARE FUNCTION NeedProcFiles () AS INTEGER
  59. DECLARE FUNCTION NeedWinFiles () AS INTEGER
  60. DECLARE FUNCTION SendMessage LIB "user"(hwnd%, wMsg%, wParam%, lParam&)
  61. INIT:
  62.     hwnd% = HwndFrame()
  63.     istatus% = SendMessage(hwnd%, WM_SYSCOMMAND, SC_MAXIMIZE,0)  ''Maximize the window
  64.     CUIDLL$ = "mscuistf.dll"            ''Custom user interface dll
  65.     HELPPROC$ = "FHelpDlgProc"          ''Help dialog procedure
  66.     SQLTOOLS$ = "SQL Server Tools"
  67.     SetBitmap CUIDLL$, LOGO
  68.     SetTitle "Microsoft Visual Basic for SQL Server Tools Setup"
  69.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  70.     IF szInf$ = "" THEN
  71. szInf$ = GetSymbolValue("STF_CWDDIR") + "VBSQL.INF"
  72.     END IF
  73.     ReadInfFile szInf$
  74.     WINDRIVE$ = MID$(GetWindowsDir, 1, 1)
  75.     WINSYSDIR$ = GetWindowsSysDir()
  76.     WINDOWSDIR$ = GetWindowsDir()
  77.     DEST$ = WINDRIVE$ + ":MSSQL"
  78.     ''CustInst list symbols
  79.     CHECKSTATES$ = "CheckItemsState"
  80.     STATUSTEXT$  = "StatusItemsText"
  81.     DRIVETEXT$  = "DriveStatusText"
  82.     FOR i% = 1 to 3 STEP 1
  83.        AddListItem CHECKSTATES$, "ON"
  84.     NEXT i%
  85.     FOR i% = 1 to 3 STEP 1
  86.         AddListItem STATUSTEXT$, ""
  87.     NEXT i%
  88.     FOR i% = 1 to 7 STEP 1
  89.         AddListItem DRIVETEXT$, ""
  90.     NEXT i%
  91.     ReplaceListItem DRIVETEXT$, 7, DEST$
  92.     ''Disk cost list symbols
  93.     LIBNEEDS$    = "LibraryNeeds"
  94.     EXAMPLENEEDS$  = "ExampleNeeds"
  95.     HELPNEEDS$    = "HelpNeeds"
  96.     EXTRACOSTS$ = "ExtraCosts"
  97.     BIGLIST$    = "BigList"
  98.     FOR i% = 1 to 3 STEP 1
  99.         AddListItem BIGLIST$, ""
  100.     NEXT i%
  101.     FOR i% = 1 TO 26 STEP 1
  102.         AddListItem EXTRACOSTS$, "0"
  103.     NEXT i%
  104.     RecalcPath
  105.     SetDriveStatus
  106. WELCOME:
  107.     sz$ = UIStartDlg(CUIDLL$, WELCOME, "FInfoDlgProc", WELCOMEHELP, HELPPROC$)
  108.     IF sz$ = "CONTINUE" THEN
  109.         UIPop 1
  110. WELCOMEL1:
  111.         IF InitSystem(1, "", 0) = 0 THEN
  112.             GOSUB ASKQUIT
  113.             GOTO WELCOMEL1
  114.         END IF
  115.     ELSE
  116.         GOSUB ASKQUIT
  117.         GOTO WELCOME
  118.     END IF
  119. GETPATH:
  120.     SetSymbolValue "EditTextIn", DEST$
  121.     SetSymbolValue "EditFocus", "END"
  122. GETPATHL1:
  123.     sz$ = UIStartDlg(CUIDLL$, DESTPATH, "FEditDlgProc", PATHHELP, HELPPROC$)
  124.     DEST$ = GetSymbolValue("EditTextOut")
  125.     IF sz$ = "CONTINUE" THEN
  126.         IF IsDirWritable(DEST$) = 0 THEN
  127.             GOSUB BADPATH
  128.             GOTO GETPATHL1
  129. END IF
  130.         UIPop 1
  131.     ELSEIF sz$ = "REACTIVATE" THEN
  132.         GOTO GETPATHL1
  133.     ELSE
  134.         GOSUB ASKQUIT
  135.         GOTO GETPATH
  136.     END IF
  137. CUSTINST:
  138.     ReplaceListItem DRIVETEXT$, 7, DEST$
  139.     sz$ = UIStartDlg(CUIDLL$, CUSTINST, "FCustInstDlgProc", CUSTHELP, HELPPROC$)
  140.     IF sz$ = "CONTINUE" THEN
  141.         ''Install only if it will fit.
  142. FOR i% = 1 to 3 STEP 1
  143.             IF GetListItem(BIGLIST$, i%) <> "" THEN
  144.                 GOSUB TOOBIG
  145.                 GOTO CUSTINST
  146.             END IF
  147.         NEXT i%
  148.         UIPop 1
  149. GOTO CHECKSELECT
  150.     ELSEIF sz$ = "PATH" THEN
  151. GOTO GETPATH
  152.     ELSEIF sz$ = "REACTIVATE" THEN
  153.         RecalcPath
  154.         SetDriveStatus
  155.         GOTO CUSTINST
  156.     ELSEIF sz$ = "CHK1" THEN
  157. RecalcOptFiles LIBFILES
  158. SetDriveStatus
  159.         GOTO CUSTINST
  160.     ELSEIF sz$ = "CHK2" THEN
  161. RecalcOptFiles EXAMPLEFILES
  162.         SetDriveStatus
  163.         GOTO CUSTINST
  164.     ELSEIF sz$ = "CHK3" THEN
  165. RecalcOptFiles HELPFILES
  166.         SetDriveStatus
  167.         GOTO CUSTINST
  168.     ELSE
  169.         GOSUB ASKQUIT
  170.         GOTO CUSTINST
  171.     END IF
  172. CHECKSELECT:
  173.     noselect% = 0
  174.     IF GetListItem(CHECKSTATES$, LIBFILES) = "OFF"  and GetListItem(CHECKSTATES$, HELPFILES) = "OFF" and GetListItem(CHECKSTATES$, EXAMPLEFILES) = "OFF" THEN
  175. noselect% = 1
  176.     END IF
  177.     IF noselect% = 1 then     'If they didn't select anything
  178.        sz$ = UIStartDlg(CUIDLL$, NOSELECTION, "FInfo0DlgProc", 0, "")
  179.        UIPop 1
  180.        GOTO CUSTINST
  181.     END IF
  182. CREATEDEST:
  183.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  184.     CreateDir DEST$, cmoVital ''Create the destination directory
  185.     i% = SetSizeCheckMode(scmOff)
  186.     DESTSAVE$ = DEST$ ''Save dest directory as the root path
  187.     SetCopyGaugePosition 100, 100
  188.  COPYLIBFILES:
  189.     ClearCopyList      ''Clear the copy list
  190.     IF GetListItem(CHECKSTATES$, LIBFILES) = "ON" THEN
  191. DEST$ = DESTSAVE$ + "bin"
  192. CreateDir DEST$, cmoVital      ''Create the bin directory
  193. AddSectionFilesToCopyList "LibFiles", SrcDir$, DEST$
  194. AddSectionFilesToCopyList "LibFiles", SrcDir$, WINSYSDIR$
  195. CopyFilesInCopyList       ''Copy the files
  196. ClearCopyList       ''Clear the copy list
  197. DEST$ = DESTSAVE$ + "dblib"
  198. CreateDir DEST$, cmoVital     ''Create the dblib directory
  199. DEST$ = DEST$ + "include"
  200. CreateDir DEST$, cmoVital      ''Create the include directory
  201. AddSectionFilesToCopyList "IncludeFile", SrcDir$, DEST$
  202. CopyFilesInCopyList       ''Copy the files
  203. ClearCopyList       ''Clear the copy list
  204.     END IF
  205. CHECKSAMPLES:
  206.     IF GetListItem(CHECKSTATES$, EXAMPLEFILES) = "ON" THEN
  207. DEST$ = DESTSAVE$ + "dblib"
  208. CreateDir DEST$, cmoVital     ''Create the dblib directory
  209. DEST$ = DEST$ + "vsamples"
  210. CreateDir DEST$, cmoVital      ''Create the vsamples directory
  211. AddSectionFilesToCopyList "ReadmeSamples", SrcDir$, DEST$
  212. CopyFilesInCopyList       ''Copy the files
  213. ClearCopyList       ''Clear the copy list
  214. SAMPDEST$ = DEST$
  215. DEST$ = SAMPDEST$ + "common"
  216. CreateDir DEST$, cmoVital      ''Create the destination directory
  217. AddSectionFilesToCopyList "ProcedureFiles", SrcDir$, DEST$
  218. CopyFilesInCopyList       ''Copy the files
  219. ClearCopyList       ''Clear the copy list
  220. DEST$ = DESTSAVE$ + "dblibvsampleswincode"
  221. CreateDir DEST$, cmoVital      ''Create the destination directory
  222. AddSectionFilesToCopyList "WinCodeFiles", SrcDir$, DEST$
  223. CopyFilesInCopyList       ''Copy the files
  224. ClearCopyList       ''Clear the copy list
  225. DEST$ = SAMPDEST$ + "browse"
  226. CreateDir DEST$, cmoVital      ''Create the destination directory
  227. AddSectionFilesToCopyList "BrowseFiles", SrcDir$, DEST$
  228. CopyFilesInCopyList       ''Copy the files
  229. ClearCopyList       ''Clear the copy list
  230. DEST$ = SAMPDEST$ + "text"
  231. CreateDir DEST$, cmoVital      ''Create the destination directory
  232. AddSectionFilesToCopyList "TextFiles", SrcDir$, DEST$
  233. CopyFilesInCopyList       ''Copy the files
  234. ClearCopyList       ''Clear the copy list
  235. DEST$ = SAMPDEST$ + "image"
  236. CreateDir DEST$, cmoVital      ''Create the destination directory
  237. AddSectionFilesToCopyList "ImageFiles", SrcDir$, DEST$
  238. CopyFilesInCopyList       ''Copy the files
  239. ClearCopyList       ''Clear the copy list
  240. DEST$ = SAMPDEST$ + "cursors"
  241. CreateDir DEST$, cmoVital      ''Create the destination directory
  242. AddSectionFilesToCopyList "CursorFiles", SrcDir$, DEST$
  243. CopyFilesInCopyList       ''Copy the files
  244. ClearCopyList       ''Clear the copy list
  245. DEST$ = SAMPDEST$ + "query"
  246. CreateDir DEST$, cmoVital      ''Create the destination directory
  247. AddSectionFilesToCopyList "QueryFiles", SrcDir$, DEST$
  248. CopyFilesInCopyList       ''Copy the files
  249. ClearCopyList       ''Clear the copy list
  250. DEST$ = SAMPDEST$ + "rpc"
  251. CreateDir DEST$, cmoVital      ''Create the destination directory
  252. AddSectionFilesToCopyList "RPCFiles", SrcDir$, DEST$
  253. CopyFilesInCopyList       ''Copy the files
  254. ClearCopyList       ''Clear the copy list
  255. DEST$ = SAMPDEST$ + "pubs"
  256. CreateDir DEST$, cmoVital      ''Create the destination directory
  257. AddSectionFilesToCopyList "PubsFiles", SrcDir$, DEST$
  258. CopyFilesInCopyList       ''Copy the files
  259. ClearCopyList       ''Clear the copy list
  260.     END IF
  261. COPYHELPFILES:
  262.     IF GetListItem(CHECKSTATES$, HELPFILES) = "ON" THEN
  263. DEST$ = DESTSAVE$ + "help"
  264. CreateDir DEST$, cmoVital      ''Create the destination directory
  265. AddSectionFilesToCopyList "HelpFiles", SrcDir$, DEST$
  266. CopyFilesInCopyList       ''Copy the files
  267. ClearCopyList       ''Clear the copy list
  268. CreateProgmanGroup SQLTOOLS$,"",cmoNone
  269. CreateProgmanItem SQLTOOLS$,"VBSQL Help",DEST$+"vbsql.hlp","",cmoOverwrite
  270.     END IF
  271. QUIT:
  272.     ON ERROR GOTO ERRQUIT
  273.     IF ERR = 0 THEN
  274.         dlg% = EXITSUCCESS
  275.     ELSEIF ERR = STFQUIT THEN
  276.         dlg% = EXITQUIT
  277.     ELSE
  278.         dlg% = EXITFAILURE
  279.     END IF
  280. QUITL1:
  281.     sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfo0DlgProc", 0, "")
  282.     IF sz$ = "REACTIVATE" THEN
  283.         GOTO QUITL1
  284.     END IF
  285.     UIPop 1
  286.     END
  287. ERRQUIT:
  288.     i% = DoMsgBox("Setup sources were corrupted, contact your primary support provider.", "Setup Message", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  289.     END
  290. TOOBIG:
  291.     sz$ = UIStartDlg(CUIDLL$, TOOBIG, "FInfo0DlgProc", 0, "")
  292.     IF sz$ = "REACTIVATE" THEN
  293.         RecalcPath
  294.         SetDriveStatus
  295.         GOTO TOOBIG
  296.     END IF
  297.     UIPop 1
  298.     RETURN
  299. BADPATH:
  300.     sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfo0DlgProc", 0, "")
  301.     IF sz$ = "REACTIVATE" THEN
  302.         GOTO BADPATH
  303.     END IF
  304.     UIPop 1
  305.     RETURN
  306. ASKQUIT:
  307.     sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
  308.     IF sz$ = "EXIT" THEN
  309.         UIPopAll
  310.         ERROR STFQUIT
  311.     ELSEIF sz$ = "REACTIVATE" THEN
  312.         GOTO ASKQUIT
  313.     ELSE
  314.         UIPop 1
  315.     END IF
  316.     RETURN
  317. '**
  318. '** Purpose:
  319. '**     Adds the specified option files to the copy list.
  320. '** Arguments:
  321. '**     ftype%  - type of files to add, one of the following:
  322. '**             ADMINFILES, OBJFILES, BASEFILES
  323. '** Returns:
  324. '**     none.
  325. '*************************************************************************
  326. SUB AddOptFilesToCopyList (ftype%) STATIC
  327.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  328.     IF GetListItem(CHECKSTATES$, ftype%) = "ON" THEN
  329. IF ftype% = LIBFILES THEN
  330.     AddSectionFilesToCopyList "LibFiles", SrcDir$, DEST$
  331.     AddSectionFilesToCopyList "IncludeFile", SrcDir$, DEST$
  332. ELSEIF ftype% = EXAMPLEFILES THEN
  333.     AddSectionFilesToCopyList "ProcedureFiles", SrcDir$, DEST$
  334.     AddSectionFilesToCopyList "WinCodeFiles", SrcDir$, DEST$
  335.     AddSectionFilesToCopyList "BrowseFiles", SrcDir$, DEST$
  336.     AddSectionFilesToCopyList "ImageFiles", SrcDir$, DEST$
  337.     AddSectionFilesToCopyList "TextFiles", SrcDir$, DEST$
  338.     AddSectionFilesToCopyList "CursorFiles", SrcDir$, DEST$
  339.     AddSectionFilesToCopyList "QueryFiles", SrcDir$, DEST$
  340.     AddSectionFilesToCopyList "RPCFiles", SrcDir$, DEST$
  341.     AddSectionFilesToCopyList "PubsFiles", SrcDir$, DEST$
  342. ELSEIF ftype% = HELPFILES THEN
  343.     AddSectionFilesToCopyList "HelpFiles", SrcDir$, DEST$
  344. END IF
  345. SrcDir$ = ""
  346.     END IF
  347. END SUB
  348. '**
  349. '** Purpose:
  350. '**     Recalculates disk space for the given option files and sets
  351. '**     the status info symbol "StatusItemsText".
  352. '** Arguments:
  353. '**     ftype% - type of files to add, one of the following:
  354. '**             LIBFILES,
  355. '**             EXAMPLEFILES, HELPFILES
  356. '** Returns:
  357. '**     none.
  358. '*************************************************************************
  359. SUB RecalcOptFiles (ftype%) STATIC
  360.     CursorSave% = ShowWaitCursor()
  361.     ClearCopyList
  362.     AddOptFilesToCopyList ftype%
  363.     DESTSAVE$ = DEST$
  364.     fExtra% = 0
  365.     IF ftype% = LIBFILES THEN
  366. ListSym$ = LIBNEEDS$
  367. IF GetListItem(CHECKSTATES$, LIBFILES) = "ON" THEN
  368.             ''Add extra cost to Windows drive for ini/progman, etc., dll's vbx's
  369.             ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
  370.             ReplaceListItem EXTRACOSTS$, ndrive%, "270240"
  371.             fExtra% = 1
  372. END IF
  373.     ELSEIF ftype% = EXAMPLEFILES THEN
  374. ListSym$ = EXAMPLENEEDS$
  375. DEST$ = DEST$ + "dblibvsamplesbrowse"
  376. IF GetListItem(CHECKSTATES$, EXAMPLEFILES) = "ON" THEN
  377.     ''Add extra cost to Windows drive for ini/progman, etc.
  378.             ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
  379.             ReplaceListItem EXTRACOSTS$, ndrive%, "10240"
  380.             fExtra% = 1
  381. END IF
  382.     ELSEIF ftype% = HELPFILES THEN
  383. ListSym$ = HELPNEEDS$
  384. DEST$ = DEST$ + "help"
  385. IF GetListItem(CHECKSTATES$, HELPFILES) = "ON" THEN
  386.     ''Add extra cost to Windows drive for ini/progman, etc.
  387.             ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
  388.             ReplaceListItem EXTRACOSTS$, ndrive%, "10240"
  389.             fExtra% = 1
  390. END IF
  391.     END IF
  392.     StillNeed& = GetCopyListCost(EXTRACOSTS$, ListSym$, "")
  393.     IF StillNeed& > 0 THEN
  394.         ReplaceListItem BIGLIST$, ftype%, "YES"
  395.     ELSE
  396.         ReplaceListItem BIGLIST$, ftype%, ""
  397.     END IF
  398.     cost& = 0
  399.     FOR i% = 1 TO 26 STEP 1
  400. cost&  = cost& + VAL(GetListItem(ListSym$, i%))
  401.     NEXT i%
  402.     ReplaceListItem STATUSTEXT$, ftype%, STR$(cost& / 1024) + " K"
  403.     IF fExtra% THEN
  404.         ReplaceListItem EXTRACOSTS$, ndrive%, "0"
  405.     END IF
  406.     RestoreCursor CursorSave%
  407.     ListSym$ = ""
  408.     DEST$ = DESTSAVE$
  409. END SUB
  410. '**
  411. '** Purpose:
  412. '**     Recalculates disk space and sets option status info according
  413. '**     to the current destination path.
  414. '** Arguments:
  415. '**     none.
  416. '** Returns:
  417. '**     none.
  418. '*************************************************************************
  419. SUB RecalcPath STATIC
  420.     CursorSave% = ShowWaitCursor()
  421.     RecalcOptFiles LIBFILES
  422.     RecalcOptFiles EXAMPLEFILES
  423.     RecalcOptFiles HELPFILES
  424.     RestoreCursor CursorSave%
  425. END SUB
  426. '**
  427. '** Purpose:
  428. '**     Sets drive status info according to latest disk space calcs.
  429. '** Arguments:
  430. '**     none.
  431. '** Returns:
  432. '**     none.
  433. '*************************************************************************
  434. SUB SetDriveStatus STATIC
  435.     drive$ = MID$(DEST$, 1, 1)
  436.     ndrive% = ASC(ucase$(drive$)) - ASC("A") + 1
  437.     cost& = VAL(GetListItem(LIBNEEDS$, ndrive%)) + VAL(GetListItem(EXAMPLENEEDS$, ndrive%)) + VAL(GetListItem(HELPNEEDS$, ndrive%))
  438.     free& = GetFreeSpaceForDrive(drive$)
  439.     ReplaceListItem DRIVETEXT$, 1, drive$ + ":"
  440.     ReplaceListItem DRIVETEXT$, 2, STR$(cost& / 1024) + " K"
  441.     ReplaceListItem DRIVETEXT$, 3, STR$(free& / 1024) + " K"
  442.     IF drive$ = WINDRIVE$ THEN
  443.         ReplaceListItem DRIVETEXT$, 4, ""
  444.         ReplaceListItem DRIVETEXT$, 5, ""
  445.         ReplaceListItem DRIVETEXT$, 6, ""
  446.     ELSE
  447. ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
  448. cost& = VAL(GetListItem(LIBNEEDS$, ndrive%)) + VAL(GetListItem(EXAMPLENEEDS$, ndrive%)) + VAL(GetListItem(HELPNEEDS$, ndrive%))
  449. IF cost& = 0 THEN
  450.             ReplaceListItem DRIVETEXT$, 4, ""
  451.             ReplaceListItem DRIVETEXT$, 5, ""
  452.             ReplaceListItem DRIVETEXT$, 6, ""
  453.         ELSE
  454.             free& = GetFreeSpaceForDrive(WINDRIVE$)
  455.             ReplaceListItem DRIVETEXT$, 4, WINDRIVE$ + ":"
  456.             ReplaceListItem DRIVETEXT$, 5, STR$(cost& / 1024) + " K"
  457.             ReplaceListItem DRIVETEXT$, 6, STR$(free& / 1024) + " K"
  458.         END IF
  459.     END IF
  460. END SUB
  461. '**
  462. '** Purpose:
  463. '**     Appends a file name to the end of a directory path,
  464. '**     inserting a backslash character as needed.
  465. '** Arguments:
  466. '**     szDir$  - full directory path (with optional ending "")
  467. '**     szFile$ - filename to append to directory
  468. '** Returns:
  469. '**     Resulting fully qualified path name.
  470. '*************************************************************************
  471. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  472.     IF szDir$ = "" THEN
  473.         MakePath = szFile$
  474.     ELSEIF szFile$ = "" THEN
  475.         MakePath = szDir$
  476.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "" THEN
  477.         MakePath = szDir$ + szFile$
  478.     ELSE
  479.         MakePath = szDir$ + "" + szFile$
  480.     END IF
  481. END FUNCTION