home *** CD-ROM | disk | FTP | other *** search
/ VRML Tools for 3D Cyberspace / VRML_Tools_For_3D_Cyberspace.iso / virtus / prolocal.in_ / prolocal.bin
Text File  |  1996-07-01  |  16KB  |  512 lines

  1. '----------------------------------------------------------------
  2. '- more specialized little functions to make our lives easier.
  3. '- John Alspaugh 10OCT94
  4. '- Copyright 1993-1994 Virtus Corporation.  All Rights Reserved.
  5. '-
  6. '- Note that this must be included after MSDETECT.INC and SETUPAPI.INC
  7. '-
  8. '----------------------------------------------------------------
  9. '-------------------------------------------------------------------
  10. '' VL_* functions are those with local variable references.
  11. '' V* functions can stand alone.
  12. '-------------------------------------------------------------------
  13.  
  14. '' define one of these:  PROGRAM or LIBRARY.  It defines the dialog
  15. '' IDs and stuff.
  16. '$DEFINE PROGRAM
  17.  
  18. '$ifdef PROGRAM
  19. '$DEFINE OPTION  ''if OPTION, then give the user the choice of a custom install.
  20. ''''$DEFINE SERIAL  ''no serial, no work.
  21. '$DEFINE CHATTER  '' turns on the little blurby messages during the install
  22. '''$ELSE IF LIBRARY
  23. '$endif 'PROGRAM
  24.  
  25. '*******************************************************************
  26. ' consts for dialogs
  27. CONST MODWININI_DLG        = 7600
  28.  
  29.  
  30. '*******************************************************************
  31. ' declare all the functions up front.
  32. DECLARE SUB VL_Initialize
  33.  
  34. DECLARE SUB VL_InitDiskCosts
  35. DECLARE SUB VL_RecalcOptFiles (ftype%)
  36. DECLARE FUNCTION VL_DoCheckItems(pItem$) AS INTEGER
  37. DECLARE FUNCTION VL_CalcDiskCost(pDrive$) AS LONG
  38. DECLARE SUB VL_SetupBillboards
  39.  
  40. DECLARE SUB VL_InitDirNames
  41. DECLARE SUB VL_RecalcPath
  42. DECLARE SUB VL_AddOptFilesToCopyList (ftype%)
  43. DECLARE SUB VL_DoTheInstall
  44. DECLARE SUB VL_MakeTheAppIcons
  45. DECLARE SUB VL_ShowIconsOkay
  46. DECLARE FUNCTION VL_ShouldWeSerialize AS INTEGER
  47.  
  48. DECLARE SUB VL_InitReadmeFileNames
  49. DECLARE SUB VL_MakeTheReadmeIcons
  50.  
  51.  
  52. '*******************************************************************
  53. ' these are the global variable things.  They get used in lots of
  54. ' areas
  55. '' there should be one I* const for each checkbox in dialog #6200
  56. CONST IAPPFILES     = 1
  57. CONST ILIBRARIES    = 2
  58. CONST IMODELS        = 3
  59. CONST ITEXTURES     = 4
  60. CONST N_CHECKBOXES  = 4 '' you get this from counting the number of
  61.                         '' checkboxes in dialog #6200
  62.  
  63. GLOBAL DESTDIRNAME$   '' the path of the destination directory
  64. GLOBAL PRODUCTNAME$     '' the real name of the product (like "Virtus VR")
  65. GLOBAL EXEFILENAME$     '' the name of the exe (like VIRTUSVR.EXE)
  66. GLOBAL PROGRAMGROUP$    '' name we want the group to have in the Program Manager
  67. GLOBAL DATAFILEEXT$     '' file extension for the models (VVR, WLK)
  68. GLOBAL INFFILENAME$        '' name of the INF file
  69. GLOBAL DEFDIRNAME$        '' default directory name
  70. GLOBAL THEINIFILE$        '' name of the ini file we associate our extension in
  71. GLOBAL BACKUPINIFILE$    '' name we back the ini file up to
  72.  
  73. GLOBAL WINDRIVE$        '' windows drive (the windows dir is here)
  74. GLOBAL WINDIR$
  75. GLOBAL DIALOGDLL$        '' where the dialogs come from
  76.  
  77. ''DECLARE SUB VL_Initialize
  78.  
  79. '-------------------------------------------------------------------
  80. ' inits the variables specific to this installer.
  81. SUB VL_Initialize STATIC
  82.  
  83.     WINDIR$ = GetWindowsDir()
  84.     WINDRIVE$ = ucase$(MID$(WINDIR$, 1, 1))
  85.  
  86.     '' REPLACE ME!
  87.     PRODUCTNAME$ = "Virtus WalkThrough VRML"
  88.     EXEFILENAME$ = "VWTVRML.EXE"
  89.     PROGRAMGROUP$ = "Virtus WalkThrough VRML"
  90.     DATAFILEEXT$ = "WTV"
  91.     INFFILENAME$ = "VWTVRML.INF"
  92.     DEFDIRNAME$ = "VWTVRML"
  93.     BACKUPINIFILE$ = "winini.vpr"
  94.     '' REPLACE ME!
  95.     DESTDIRNAME$ = WINDRIVE$ + ":\" + DEFDIRNAME$
  96.     THEINIFILE$ = "win.ini"
  97.     DIALOGDLL$ = "mscuistf.dll"
  98.  
  99. END SUB
  100.  
  101.  
  102. '*******************************************************************
  103. ' Variable and functions for the disk cost stuff.  There is one
  104. ' variable for each section in the dialog #6200.  Also related are
  105. ' the I* constants in the previous section
  106. ''CustInst list symbol names
  107. GLOBAL APPNEEDS$    'Application items need this much disk space
  108. GLOBAL LIBRARYNEEDS$  'Gallery items need
  109. GLOBAL MODELNEEDS$ 'Scene items need this much disk space
  110. GLOBAL TEXTURENEEDS$ 'Texture items need this much disk space
  111. GLOBAL PLAYERNEEDS$ 'Texture items need this much disk space
  112. GLOBAL EXTRACOSTS$  'List of extra costs to add per drive. This is how much we're short.
  113.  
  114. ''DECLARE SUB VL_InitDiskCosts
  115. ''DECLARE SUB VL_RecalcOptFiles (ftype%)
  116. ''DECLARE FUNCTION VL_DoCheckItems(pItem$) AS INTEGER
  117. ''DECLARE FUNCTION VL_CalcDiskCost(pDrive$) AS LONG
  118.  
  119. '-------------------------------------------------------------------
  120. ' inits the variables specific to calculating the disk costs
  121. SUB VL_InitDiskCosts STATIC
  122.  
  123.     ''Disk cost list symbols
  124.     '' REPLACE ME!
  125.     APPNEEDS$   = "AppNeeds"
  126.     LIBRARYNEEDS$  = "LibraryNeeds"
  127.     MODELNEEDS$  = "ModelNeeds"
  128.     TEXTURENEEDS$  = "TextureNeeds"
  129.     '' REPLACE ME!
  130.  
  131.     EXTRACOSTS$ = "ExtraCosts"
  132.     FOR i% = 1 TO 26 STEP 1
  133.         AddListItem APPNEEDS$, "0"
  134.         AddListItem LIBRARYNEEDS$, "0"
  135.         AddListItem MODELNEEDS$, "0"
  136.         AddListItem TEXTURENEEDS$, "0"
  137.     
  138.         AddListItem EXTRACOSTS$, "0"
  139.     NEXT i%
  140. END SUB
  141.  
  142. '-------------------------------------------------------------------
  143. ' calculates disk cost
  144. SUB VL_RecalcOptFiles (ftype%) STATIC
  145.     CursorSave% = ShowWaitCursor()
  146.     ClearCopyList
  147.     VL_AddOptFilesToCopyList ftype%
  148.  
  149.     fExtra% = 0
  150.     ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
  151.  
  152.     IF ftype% = IAPPFILES THEN
  153. '$IFDEF PROGRAM
  154.         IF GetListItem(CHECKSTATES$, IAPPFILES) = "ON" THEN
  155.             ''Add extra cost to Windows drive for ini/progman, etc.
  156.             ReplaceListItem EXTRACOSTS$, ndrive%, "10240"
  157.             fExtra% = 1
  158.         END IF
  159. '$ENDIF 'PROGRAM
  160.         ListSym$ = APPNEEDS$
  161.     ELSEIF ftype% = ILIBRARIES THEN
  162.         ListSym$ = LIBRARYNEEDS$
  163.     ELSEIF ftype% = IMODELS THEN
  164.         ListSym$ = MODELNEEDS$
  165.     ELSEIF ftype% = ITEXTURES THEN
  166.         ListSym$ = TEXTURENEEDS$
  167.     ELSE
  168.         ListSym$ = ""
  169.     END IF
  170.  
  171.     StillNeed& = GetCopyListCost(EXTRACOSTS$, ListSym$, "")
  172.  
  173.     cost& = 0
  174.     FOR i% = 1 TO 26 STEP 1
  175.         cost&  = cost& + VAL(GetListItem(ListSym$, i%))
  176.     NEXT i%
  177.        ReplaceListItem STATUSTEXT$, ftype%, STR$(cost& / 1024) + " K"
  178.  
  179.     IF fExtra% THEN
  180.         ReplaceListItem EXTRACOSTS$, ndrive%, "0"
  181.     END IF
  182.     RestoreCursor CursorSave%
  183.     ListSym$ = ""
  184. END SUB
  185.  
  186.  
  187.  
  188. '-------------------------------------------------------------------
  189. ' handles the custom install (dialog #6200) checkboxes.  Order is
  190. ' set in the dialog itself.
  191. FUNCTION VL_DoCheckItems(pItem$) STATIC AS INTEGER
  192.     IF pItem$ = "CHK1" THEN
  193.         VL_RecalcOptFiles IAPPFILES
  194.         ok% = 1
  195.     ELSEIF pItem$ = "CHK2" THEN
  196.         VL_RecalcOptFiles ILIBRARIES
  197.         ok% = 1
  198.     ELSEIF pItem$ = "CHK3" THEN
  199.         VL_RecalcOptFiles IMODELS
  200.         ok% = 1
  201.     ELSEIF pItem$ = "CHK4" THEN
  202.         VL_RecalcOptFiles ITEXTURES
  203.         ok% = 1
  204.     ELSE
  205.         ok% = 0
  206.     END IF
  207.  
  208.     VL_DoCheckItems = ok%
  209.  
  210. END FUNCTION
  211.  
  212.  
  213. '-------------------------------------------------------------------
  214. ' Calculates the cost of installing the items in the list by adding
  215. ' the cost associated with each of the items.
  216. FUNCTION VL_CalcDiskCost (pDrive$) STATIC AS LONG
  217. '$ifdef DEBUG
  218.     if pDrive$ = "" then
  219.         BadArgErr 1, "VL_CalcDiskCost", pDrive$
  220.     end if
  221. '$endif ''DEBUG
  222.     ndrive% = ASC(ucase$(pDrive$)) - ASC("A") + 1
  223.  
  224.     diskCost& = 0
  225.  
  226.     ''REPLACE ME BEGIN
  227.     diskCost& = diskCost& + VAL(GetListItem(APPNEEDS$, ndrive%))
  228.     diskCost& = diskCost& + VAL(GetListItem(LIBRARYNEEDS$, ndrive%))
  229.     diskCost& = diskCost& + VAL(GetListItem(MODELNEEDS$, ndrive%))
  230.     diskCost& = diskCost& + VAL(GetListItem(TEXTURENEEDS$, ndrive%))
  231.     ''REPLACE ME END
  232.  
  233.     VL_CalcDiskCost = diskCost&
  234.  
  235. END FUNCTION
  236.  
  237.  
  238.  
  239. SUB VL_SetupBillboards STATIC
  240.  
  241.     ClearBillboardList
  242.  
  243.     AddToBillboardList DIALOGDLL$, 110, "FModelessDlgProc", 40
  244.     AddToBillboardList DIALOGDLL$, 111, "FModelessDlgProc", 40
  245.     AddToBillboardList DIALOGDLL$, 112, "FModelessDlgProc", 40
  246.     AddToBillboardList DIALOGDLL$, 114, "FModelessDlgProc", 40
  247.             
  248. END SUB
  249.  
  250.  
  251. '*******************************************************************
  252. ' Variable and functions to deal with the directory structure and to
  253. ' place items into the right directories
  254.  
  255. ' these are the names of subdirectories
  256. GLOBAL LIBRARYDirName$   'name of the library directory
  257. GLOBAL MANUALDirName$      'name of the manual directory
  258. GLOBAL MODELSDirName$   'name of the model directory
  259. GLOBAL CSPACEMODDirName$      'name of the cspace model directory
  260. GLOBAL TEMPLEMODDirName$   'name of the temple model directory
  261.  
  262. ' vars for the full paths
  263. GLOBAL LIBRARYDest$  'library/
  264. GLOBAL MANUALDest$       'manual/
  265. GLOBAL MODELSDest$      'models/
  266. GLOBAL CSPACEMODDest$      'models/cspace
  267. GLOBAL TEMPLEMODDest$    'models/temple
  268.  
  269. ''DECLARE SUB VL_InitDirNames
  270. ''DECLARE SUB VL_RecalcPath 
  271. ''DECLARE SUB VL_AddOptFilesToCopyList (ftype%)
  272. ''DECLARE SUB VL_DoTheInstall
  273. ''DECLARE SUB VL_MakeTheAppIcons
  274. ''DECLARE SUB VL_ShowIconsOkay
  275.  
  276. '-------------------------------------------------------------------
  277. ' inits the variables for the directory management routines.
  278. SUB VL_InitDirNames STATIC
  279.  
  280. ''LOCALIZE ME BEGIN
  281. LIBRARYDirName$     = "\LIBRARY"
  282. MANUALDirName$      = "\MANUAL"
  283. MODELSDirName$       = "\MODELS"
  284. CSPACEMODDirName$      = "\CSPACE"
  285. TEMPLEMODDirName$       = "\TEMPLE"
  286. ''LOCALIZE ME END
  287.  
  288. END SUB
  289.  
  290. '-------------------------------------------------------------------
  291. ' inits the variables specific to this installer.
  292. SUB VL_RecalcPath STATIC
  293.  
  294.     CursorSave% = ShowWaitCursor()
  295.  
  296.     LIBRARYDest$        = DESTDIRNAME$ + LIBRARYDirName$
  297.     MANUALDest$         = DESTDIRNAME$ + MANUALDirName$
  298.     MODELSDest$         = DESTDIRNAME$ + MODELSDirName$
  299.     CSPACEMODDest$         = MODELSDest$ + CSPACEMODDirName$
  300.     TEMPLEMODDest$          = MODELSDest$ + TEMPLEMODDirName$
  301.  
  302.     VL_RecalcOptFiles IAPPFILES
  303.     VL_RecalcOptFiles ILIBRARIES
  304.     VL_RecalcOptFiles IMODELS
  305.     VL_RecalcOptFiles ITEXTURES
  306.     
  307.     RestoreCursor CursorSave%
  308. END SUB
  309.  
  310.  
  311. '-------------------------------------------------------------------
  312. ' inits the variables specific to this installer.
  313. SUB VL_AddOptFilesToCopyList (ftype%) STATIC
  314.  
  315.     IF GetListItem(CHECKSTATES$, ftype%) = "ON" THEN
  316.         SrcDir$ = GetSymbolValue("STF_SRCDIR")
  317.         IF ftype% = IAPPFILES THEN
  318.             AddSectionFilesToCopyList "AppFiles", SrcDir$, DESTDIRNAME$
  319.             AddSectionFilesToCopyList "AlwaysInstall", SrcDir$, DESTDIRNAME$
  320.         ELSEIF ftype% = ILIBRARIES THEN
  321.                AddSectionFilesToCopyList "Library", SrcDir$, LIBRARYDest$        
  322.         ELSEIF ftype% = IMODELS THEN
  323.             AddSectionFilesToCopyList "Models", SrcDir$, MODELSDest$
  324.             AddSectionFilesToCopyList "CSpace", SrcDir$, CSPACEMODDest$
  325.             AddSectionFilesToCopyList "Temple", SrcDir$, TEMPLEMODDest$
  326.         ELSEIF ftype% = ITEXTURES THEN
  327.             AddSectionFilesToCopyList "Manual", SrcDir$, MANUALDest$
  328.             END IF
  329.         SrcDir$ = ""
  330.     END IF
  331. END SUB
  332.  
  333.  
  334. SUB VL_DoTheInstall STATIC
  335.  
  336.     CursorSave% = ShowWaitCursor()
  337.  
  338.     ClearCopyList
  339.  
  340.     ''application
  341.     IF GetListItem(CHECKSTATES$, IAPPFILES) = "ON" THEN
  342.         CreateDir DESTDIRNAME$, cmoNone
  343.         VL_AddOptFilesToCopyList IAPPFILES
  344.  
  345.         SetRestartDir WINDIR$    '' restart in
  346.     END IF
  347.  
  348.     '' 2D & 3D galleries
  349.     IF GetListItem(CHECKSTATES$, ILIBRARIES) = "ON" THEN
  350.         CreateDir LIBRARYDest$, cmoNone
  351.         VL_AddOptFilesToCopyList ILIBRARIES
  352.     END IF
  353.  
  354.     '' VR scenes, models
  355.     IF GetListItem(CHECKSTATES$, IMODELS) = "ON" THEN
  356.         CreateDir MODELSDest$, cmoNone
  357.         CreateDir CSPACEMODDest$, cmoNone
  358.         CreateDir TEMPLEMODDest$, cmoNone
  359.         VL_AddOptFilesToCopyList IMODELS
  360.     END IF
  361.  
  362.     '' texture libs
  363.      IF GetListItem(CHECKSTATES$, ITEXTURES) = "ON" THEN
  364.         CreateDir MANUALDest$, cmoNone
  365.         VL_AddOptFilesToCopyList ITEXTURES
  366.     END IF
  367.  
  368.     
  369.  '$IFDEF CHATTER
  370.     VL_SetupBillboards
  371. '$ENDIF '' CHATTER
  372.  
  373.     CopyFilesInCopyList
  374.  
  375.     RestoreCursor CursorSave%
  376.  
  377. END SUB
  378.  
  379.  
  380. SUB VL_MakeTheAppIcons STATIC
  381.  
  382.     IF (GetListItem(CHECKSTATES$, IAPPFILES) = "ON")  THEN
  383.  
  384. '$IFDEF PROGRAM
  385.         '' make backup for the win.ini file, tell user about it.
  386.         winOld$ = VMakePath(GetWindowsDir(), BACKUPINIFILE$)
  387.     '''    sz$ = UIStartDlg("mscuistf.dll", MODWININI_DLG, "FInfo0DlgProc", 0, "")
  388.         CopyFile VMakePath(GetWindowsDir(), THEINIFILE$), winOld$, cmoOverwrite, 0
  389.  
  390.     '''    UIPop 1
  391.  
  392.         ''Create the WalkThrough group
  393.         CreateProgmanGroup PROGRAMGROUP$, "", cmoNone
  394.  
  395.         IF GetListItem(CHECKSTATES$, IAPPFILES) = "ON" THEN
  396.             ''Associate .WTV and files with the application. This is writing stuff to WIN.INI.
  397.             CreateIniKeyValue THEINIFILE$,"Extensions",DATAFILEEXT$,VMakePath(DESTDIRNAME$, EXEFILENAME$)+" ^" + DATAFILEEXT$,cmoOverwrite
  398.             CreateProgmanItem PROGRAMGROUP$, PRODUCTNAME$, VMakePath(DESTDIRNAME$, EXEFILENAME$), "", cmoOverwrite
  399.  
  400.         '' if no WalkThrough, do the same with .wlk
  401.         IF VFindExeFromRegistration ("WTP", lDest$) = 0 THEN
  402.             CreateIniKeyValue THEINIFILE$,"Extensions","WTP",VMakePath(DESTDIRNAME$, EXEFILENAME$)+" ^" + "WLK",cmoNone
  403.         ENDIF
  404.  
  405.         '' if no WalkThrough, do the same with .wlk
  406.         IF VFindExeFromRegistration ("WLK", lDest$) = 0 THEN
  407.             CreateIniKeyValue THEINIFILE$,"Extensions","WLK",VMakePath(DESTDIRNAME$, EXEFILENAME$)+" ^" + "WLK",cmoNone
  408.         ENDIF
  409.  
  410.         '' if no VR, do the same with .vvr
  411.         IF VFindExeFromRegistration ("VVR", lDest$) = 0 THEN
  412.             CreateIniKeyValue THEINIFILE$,"Extensions","VVR",VMakePath(DESTDIRNAME$, EXEFILENAME$)+" ^" + "VVR",cmoNone
  413.         ENDIF
  414.  
  415.         END IF
  416.  
  417.     
  418. '$ENDIF '' PROGRAM
  419.  
  420.     END IF
  421.  
  422.  
  423.  
  424.  
  425. END SUB
  426.  
  427.  
  428. SUB VL_ShowIconsOkay STATIC
  429.     IF (GetListItem(CHECKSTATES$, IAPPFILES) = "ON") THEN
  430.          ShowProgmanGroup  PROGRAMGROUP$, 1, cmoNone
  431.  
  432.         Restart% = RestartListEmpty()
  433.         IF Restart% = 0 THEN
  434.             Exe$ = WINDIR$ + "\_msrstrt.exe"
  435.             Batch$ = WINDIR$ + "\_mssetup.bat"
  436.             I% = ExitExecRestart ()
  437.             RemoveFile Exe$, cmoForce
  438.             RemoveFile Batch$, cmoForce
  439.         END IF
  440.  
  441.     END IF
  442. END SUB
  443.  
  444.  
  445.  
  446.  
  447. '-------------------------------------------------------------------
  448. ' do we want to call the serial number stuff?
  449. FUNCTION VL_ShouldWeSerialize STATIC AS INTEGER
  450.  
  451. '$ifdef SERIAL
  452.     IF GetListItem(CHECKSTATES$, IAPPFILES) = "ON" THEN
  453.         VL_ShouldWeSerialize = 1
  454.     ELSE
  455.         VL_ShouldWeSerialize = 0
  456.     END IF
  457. '$else
  458.     VL_ShouldWeSerialize = 0
  459. '$endif
  460.  
  461. END FUNCTION
  462.  
  463. '*******************************************************************
  464. ' these are the global variable things.  They get used in lots of
  465. ' areas
  466. GLOBAL MAINREADME_FILENAME$ 'name of the main readme file
  467. GLOBAL MAINREADME_ICONNAME$ 'name for the windows icon of the main readme file
  468. ''GLOBAL SCENEREADME_FILENAME$ 'name of the scenes readme file
  469. ''GLOBAL SCENEREADME_ICONNAME$ ' name for the icon for the scenes readme file
  470. ''GLOBAL EXTRAREADME_FILENAME$ 'name of the scenes readme file
  471. ''GLOBAL EXTRAREADME_ICONNAME$ ' name for the icon for the scenes readme file
  472. ''GLOBAL OTHERREADME_FILENAME$ 'name of the scenes readme file
  473. ''GLOBAL OTHERREADME_ICONNAME$ ' name for the icon for the scenes readme file
  474.  
  475. ''DECLARE SUB VL_InitReadmeFileNames
  476. ''DECLARE SUB VL_MakeTheReadmeIcons
  477.  
  478. '-------------------------------------------------------------------
  479. ' init the readme file names
  480. SUB VL_InitReadmeFileNames STATIC
  481.  
  482.     MAINREADME_FILENAME$ = "README.TXT"   '' name of main read me file
  483.     MAINREADME_ICONNAME$ = "WalkThrough VRML 1.0 Notes"  '' icon title in windows
  484. ''    EXTRAREADME_FILENAME$ = "PLAYREAD.WRI"   '' name of extra read me file
  485. ''    EXTRAREADME_ICONNAME$ = "Player Notes" '' icon title
  486.  
  487. END SUB
  488.  
  489. '-------------------------------------------------------------------
  490. ' make icons for the readme files
  491. SUB VL_MakeTheReadmeIcons STATIC
  492.     ''Put icons for the sample scenes and the readmes into program manager.  Check that one of the files exists)
  493.     IF GetListItem(CHECKSTATES$, IAPPFILES) = "ON" THEN
  494.         ''Create the readme
  495.         CreateProgmanItem PROGRAMGROUP$, MAINREADME_ICONNAME$, VMakePath(DESTDIRNAME$, MAINREADME_FILENAME$), "", cmoOverwrite
  496.     END IF
  497.  
  498. '' if you want to have icons for the manuals (and please, please don't use notepad for the manuals;
  499. '' use Write, which comes with Windoes anyway, so it's available on the machines and looks N times
  500. '' (where N is an integer, >= 2) better than notepad).
  501. ''    IF GetListItem(CHECKSTATES$, ITEXTURES) = "ON" THEN
  502. ''        ''Create the readme
  503. ''        CreateProgmanItem PROGRAMGROUP$, OTHERREADME_ICONNAME$, VMakePath(MANUALDIRNAME$, OTHERREADME_FILENAME$), "", cmoOverwrite
  504. ''    END IF
  505.  
  506.     
  507. END SUB
  508.  
  509.  
  510.  
  511.  
  512.