home *** CD-ROM | disk | FTP | other *** search
/ Exploring the Boundaries of Sound & Vision / MM_CD.iso / cakedemo / pro45 / wincake.ms_ / wincake.bin
Encoding:
Text File  |  1996-06-17  |  46.9 KB  |  1,441 lines

  1. '**************************************************************************
  2. '* $Header:   G:/SRC/WCW/MSSETUP/VCS/WINCAKE.MSV   1.68   18 Jun 1996 14:45:36   FP  $
  3. '*
  4. '* DESCRIPTION: MS-Setup script for Wincake and Wcwdemo.
  5. '*
  6. '* $Log:   G:/SRC/WCW/MSSETUP/VCS/WINCAKE.MSV  $
  7. '* 
  8. '*    Rev 1.68   18 Jun 1996 14:45:36   FP
  9. '* Add icon for 50demo.bun for demos.
  10. '* 
  11. '*    Rev 1.67   17 Jun 1996 09:53:42   FP
  12. '* Fix #4652.  Correctly reassociate PLY files in registry.  Put in missing
  13. '* Love Street playlist for Song Station.
  14. '* 
  15. '*    Rev 1.66   14 Jun 1996 09:55:36   FP
  16. '* Add icon for Song Station's CATDISP.EXE.
  17. '* 
  18. '*    Rev 1.65   07 Jun 1996 09:41:50   FP
  19. '* Correct string typo for MISC SFX.
  20. '* 
  21. '*    Rev 1.64   05 Jun 1996 15:57:26   FP
  22. '* Add icons for Songs and Sounds playlists for Song Station.
  23. '* 
  24. '*    Rev 1.63   05 Jun 1996 11:44:12   FP
  25. '* Add Song Station.  The modification is trick in that the reference key in
  26. '* the layout does not match the application EXE name.  Must put in additional
  27. '* logic to work around this.
  28. '* 
  29. '*    Rev 1.62   03 Jun 1996 10:07:46   FP
  30. '* Update for GMs.
  31. '* 
  32. '*    Rev 1.61   21 May 1996 16:54:20   FP
  33. '* Fix icon for WAV Farren playlist.
  34. '* 
  35. '*    Rev 1.60   21 May 1996 10:40:00   FP
  36. '* Change order of techniques icons.
  37. '* 
  38. '*    Rev 1.59   20 May 1996 18:40:06   FP
  39. '* Add icon for Farren playlist.
  40. '* 
  41. '*    Rev 1.58   15 May 1996 18:25:56   FP
  42. '* Assume Techniqs is subdir off CD-ROM drive letter.
  43. '* 
  44. '*    Rev 1.56   14 May 1996 17:51:26   FP
  45. '* Set up template for maybe installing Techniques movie icons.
  46. '* 
  47. '*    Rev 1.55   20 Mar 1996 17:09:56   FP
  48. '* Update to support all products.
  49. '* 
  50. '*    Rev 1.54   06 Mar 1996 15:35:50   FP
  51. '* Include Virtual Jukebox.
  52. '* 
  53. '*    Rev 1.53   29 Feb 1996 17:45:18   FP
  54. '* Take out wave profiler related code.
  55. '* 
  56. '*    Rev 1.52   24 Jan 1996 16:46:52   FP
  57. '* Update to separate "Pro Audio" and "Professional".
  58. '* 
  59. '*    Rev 1.51   04 Jan 1996 11:37:24   FP
  60. '* Just have README.WRI icon title be README.WRI.
  61. '*
  62. '*    Rev 1.50   21 Dec 1995 12:16:24   FP
  63. '* Put in message concerning running Wave Profiler.
  64. '*
  65. '*    Rev 1.49   21 Dec 1995 10:23:30   FP
  66. '* Add messagebox to remind user to run Wave Profiler.
  67. '*
  68. '*    Rev 1.48   19 Dec 1995 17:06:06   FP
  69. '* Pro 4.01 update disk.
  70. '*
  71. '*    Rev 1.47   19 Dec 1995 14:53:36   FP
  72. '* Take out what's new section.
  73. '*
  74. '*    Rev 1.46   14 Dec 1995 09:58:50   FP
  75. '* Introduce whatsnew.wri.
  76. '*
  77. '*    Rev 1.45   14 Nov 1995 17:56:34   PS
  78. '* Added Import button to Chord dialog.  CHORDSNEW.LIW vs. CHORDS.LIW.
  79. '*
  80. '*    Rev 1.44   18 Sep 1995 15:02:24   PS
  81. '* MSACM no longer installed.
  82. '*
  83. '*    Rev 1.43   30 Aug 1995 19:05:30   FP
  84. '* Associate BUN files with Cakewalk Pro Audio.
  85. '*
  86. '*    Rev 1.42   30 Aug 1995 15:08:16   FP
  87. '* RC1 changes to reflect PR name change to Cakewalk Pro Audio.  Bring back
  88. '* install of VPiano.
  89. '*
  90. '*    Rev 1.41   23 Aug 1995 16:02:14   FP
  91. '* Beta G changes.
  92. '*
  93. '*    Rev 1.40   16 Aug 1995 11:59:16   FP
  94. '* Beta F changes.
  95. '*
  96. '*    Rev 1.39   09 Aug 1995 16:14:54   FP
  97. '* Changes for BETA E.
  98. '*
  99. '*    Rev 1.38   03 Aug 1995 13:18:52   FP
  100. '* Beta D changes.
  101. '*
  102. '*    Rev 1.37   18 Jul 1995 15:18:42   FP
  103. '* BETA C changes and addition of MSACM.
  104. '*
  105. '*    Rev 1.36   07 Jul 1995 16:16:44   FP
  106. '* Beta B changes.
  107. '*
  108. '*    Rev 1.35   16 Jun 1995 16:42:18   FP
  109. '* Added Wave Profiler to Program group.
  110. '*
  111. '*    Rev 1.34   13 Jun 1995 15:14:34   FP
  112. '* Modified for Edison Beta.  VPiano not installed.
  113. '*
  114. '*    Rev 1.33   20 Dec 1994 16:16:28   PS
  115. '* Final directory names for 3.01 RC1.
  116. '*
  117. '*    Rev 1.32   20 Dec 1994 12:53:50   PS
  118. '* Add VPIANO to Pro & Pro Demo.
  119. '*
  120. '*    Rev 1.31   13 Dec 1994 18:48:20   PS
  121. '* Added DEFAULT.INS, INS_NOT_OVERWRITTEN dialog.
  122. '*
  123. '*    Rev 1.30   01 Dec 1994 16:43:38   PS
  124. '* New, separate-product production method.  Many changes for 3.01 Beta B.
  125. '*
  126. '*    Rev 1.29   14 Nov 1994 19:31:14   PS
  127. '* Set dest directory for beta testers.
  128. '*
  129. '*    Rev 1.28   11 Nov 1994 19:06:48   PS
  130. '* CAKEXP.EXE.  Allow layout per product.
  131. '*
  132. '*    Rev 1.27   09 May 1994 13:19:02   GH
  133. '* Detect/require 80386 or higher, warn about no mouse.
  134. '*
  135. '*    Rev 1.26   28 Apr 1994 21:26:02   GH
  136. '* Use SRC.INS and MASTER.INS
  137. '*
  138. '*    Rev 1.25   25 Apr 1994 13:40:06   GH
  139. '* For CPW, changed DEST$ to C:\CPW30
  140. '*
  141. '*    Rev 1.24   15 Apr 1994 15:34:48   GH
  142. '* Changes for 2.5 Beta
  143. '*
  144. '*    Rev 1.23   17 Feb 1994 13:17:14   PS
  145. '* Associate .TPL files with us, too.
  146. '*
  147. '*    Rev 1.22   11 Jan 1994 13:47:38   CP
  148. '* Create a Home Studio Demo version.
  149. '*
  150. '*    Rev 1.21   08 Nov 1993 15:41:42   CP
  151. '* Change Lite name from WCWLITE to CAKEHS.
  152. '*
  153. '*    Rev 1.20   23 Aug 1993 14:06:06   CP
  154. '* Default installation directory for Demo is now C:\WCWDEMO to prevent
  155. '* nuking of previous installations.
  156. '*
  157. '*    Rev 1.19   24 May 1993 17:09:22   gwh
  158. '* Removed serial number item from user info prompt.
  159. '*
  160. '*    Rev 1.18   18 Apr 1993 17:50:40   gwh
  161. '* More refinements for user name, organization, serial number stamping.
  162. '*
  163. '*    Rev 1.17   01 Apr 1993 18:32:44   gwh
  164. '* Prompt user for Name, Organization, and Serial number.
  165. '* Stamp the .EXE resources for these items.
  166. '*
  167. '*    Rev 1.16   18 Mar 1993 14:06:42   pws
  168. '* No more need to clean up old DLL's in Windows sys dir (or TTSSEQ.INI).
  169. '* Also check for existence of TTSSEQ.INI in install dir before copying
  170. '* any TTSSEQ.INI found in Windows sys dir before copying new files.
  171. '*
  172. '*    Rev 1.15   05 Mar 1993 12:08:38   pws
  173. '* Fix support for multiple-disk installations, which had broken when
  174. '* we started determining which product we were by testing for the
  175. '* existence of name.EXE on the first diskette but it had been put
  176. '* on the second one.  Now determine which product we are by testing
  177. '* for existence of product-specific section in SETUP.INF file.
  178. '*
  179. '*    Rev 1.14   22 Dec 1992 13:17:36   pws
  180. '* Reflect changed dialog id's in BLDCUI\DIALOGS.H.
  181. '*
  182. '*    Rev 1.13   15 Dec 1992 14:47:18   pws
  183. '* Added CTL3D.DLL.
  184. '*
  185. '*    Rev 1.12   10 Nov 1992 12:37:56   pws
  186. '* Made more dialogs product-specific.
  187. '*
  188. '* ---
  189. '* See logfile for earlier revision comments
  190. '*
  191. '* Copyright (C) 1990- by Greg Hendershott.  All rights reserved.
  192. '**************************************************************************
  193.  
  194. '$INCLUDE 'setupapi.inc'
  195. '$INCLUDE 'msdetect.inc'
  196. '$INCLUDE 'msregdb.inc'
  197.  
  198. 'These should have all been in SETUPAPI.INC.
  199. 'Note that duplicate definitions are errors and so are commented out!
  200.  
  201. 'CONST MB_OK                = &H0000
  202. CONST MB_OKCANCEL            = &H0001
  203. CONST MB_ABORTRETRYIGNORE    = &H0002
  204. CONST MB_YESNOCANCEL        = &H0003
  205. CONST MB_YESNO                = &H0004
  206. CONST MB_RETRYCANCEL        = &H0005
  207. CONST MB_TYPEMASK            = &H000F
  208.  
  209. 'CONST MB_ICONHAND            = &H0010
  210. CONST MB_ICONQUESTION        = &H0020
  211. CONST MB_ICONEXCLAMATION    = &H0030
  212. CONST MB_ICONASTERISK        = &H0040
  213. CONST MB_ICONMASK            = &H00F0
  214.  
  215. CONST MB_ICONINFORMATION    = MB_ICONASTERISK
  216. CONST MB_ICONSTOP            = MB_ICONHAND
  217.  
  218. CONST MB_DEFBUTTON1            = &H0000
  219. CONST MB_DEFBUTTON2            = &H0100
  220. CONST MB_DEFBUTTON3            = &H0200
  221. CONST MB_DEFMASK            = &H0F00
  222.  
  223. CONST MB_APPLMODAL            = &H0000
  224. CONST MB_SYSTEMMODAL        = &H1000
  225. 'CONST MB_TASKMODAL            = &H2000
  226.  
  227. CONST MB_NOFOCUS            = &H8000
  228.  
  229. CONST IDOK                    = 1
  230. CONST IDCANCEL                = 2
  231. CONST IDABORT                = 3
  232. CONST IDRETRY                = 4
  233. CONST IDIGNORE                = 5
  234. CONST IDYES                    = 6
  235. CONST IDNO                    = 7
  236.  
  237. 'Dialog ID's.  NOTE: THIS MUST MATCH BLDCUI\DIALOGS.H!
  238. CONST WELCOME_PR            = 170
  239. CONST WELCOME_PD            = 171
  240. CONST WELCOME_HS            = 172
  241. CONST WELCOME_HD            = 173
  242. CONST WELCOME_XP            = 174
  243. CONST WELCOME_XD            = 175
  244. CONST WELCOME_PA            = 176
  245. CONST WELCOME_AD            = 177
  246. CONST WELCOME_SS            = 178
  247. CONST ASKQUIT                = 200
  248. CONST DESTPATH                = 300
  249. CONST USERINFO                = 310
  250. CONST EXITFAILURE            = 400
  251. CONST EXITQUIT_PR            = 670
  252. CONST EXITQUIT_PD            = 671
  253. CONST EXITQUIT_HS            = 672
  254. CONST EXITQUIT_HD            = 673
  255. CONST EXITQUIT_XP            = 674
  256. CONST EXITQUIT_XD            = 675
  257. CONST EXITQUIT_PA            = 676
  258. CONST EXITQUIT_AD            = 677
  259. CONST EXITQUIT_SS            = 678
  260. CONST EXITSUCCESS_PR        = 770
  261. CONST EXITSUCCESS_PD        = 771
  262. CONST EXITSUCCESS_HS        = 772
  263. CONST EXITSUCCESS_HD        = 773
  264. CONST EXITSUCCESS_XP        = 774
  265. CONST EXITSUCCESS_XD        = 775
  266. CONST EXITSUCCESS_PA        = 776
  267. CONST EXITSUCCESS_AD        = 777
  268. CONST EXITSUCCESS_SS        = 778
  269. CONST APPHELP_PR            = 970
  270. CONST APPHELP_PD            = 971
  271. CONST APPHELP_HS            = 972
  272. CONST APPHELP_HD            = 973
  273. CONST APPHELP_XP            = 974
  274. CONST APPHELP_XD            = 975
  275. CONST APPHELP_PA            = 976
  276. CONST APPHELP_AD            = 977
  277. CONST APPHELP_SS            = 978
  278. CONST INI_NOT_OVERWRITTEN    = 1000
  279. CONST INS_NOT_OVERWRITTEN    = 1100
  280. CONST CHORDS_NOT_OVERWRITTEN= 1200
  281. CONST BADPATH                = 6400
  282.  
  283. 'Bitmap ID.
  284. CONST LOGO = 1
  285.  
  286. GLOBAL COMPANY$
  287. GLOBAL PROGNAME$
  288. GLOBAL PRODUCTNAME$
  289. GLOBAL DEST$        'Default destination directory.
  290.  
  291. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  292. DECLARE SUB MaybeAssociate (szExt$)
  293. DECLARE SUB MaybeAssociateVJB (szExt$)
  294. DECLARE SUB SafeCopy(szShort$, szLong$)
  295. DECLARE FUNCTION ArgStr$ (Fmt$, Arg1$, Arg2$, Arg3$, Arg4$)
  296.  
  297. INIT:
  298. '======== beg LOCALIZATION ========
  299. 'These are the strings that need to be localized for different languages.
  300. 'Every one of them is located right here in this block.
  301.     CONST COMPANY_$ = "Twelve Tone Systems"
  302.     CONST PRODUCTNAME_PA_$ = "Cakewalk Pro Audio"
  303.     CONST PRODUCTNAME_AD_$ = "Cakewalk Pro Audio Demo"
  304.     CONST PRODUCTNAME_UP_$ = "Cakewalk Pro Audio Update"
  305.     CONST PRODUCTNAME_PR_$ = "Cakewalk Professional"
  306.     CONST PRODUCTNAME_PD_$ = "Cakewalk Professional Demo"
  307.     CONST PRODUCTNAME_HS_$ = "Cakewalk Home Studio"
  308.     CONST PRODUCTNAME_HD_$ = "Cakewalk Home Studio Demo"
  309.     CONST PRODUCTNAME_XP_$ = "Cakewalk Express"
  310.     CONST PRODUCTNAME_XD_$ = "Cakewalk Express Demo"
  311.     CONST PRODUCTNAME_SS_$ = "Cakewalk Song Station"
  312.     CONST PROGMANGROUPNAME_PA_$ = "Cakewalk Pro Audio"
  313.     CONST PROGMANGROUPNAME_PR_$ = "Cakewalk Professional"
  314.     CONST PROGMANGROUPNAME_HS_$ = "Cakewalk Home Studio"
  315.     CONST PROGMANGROUPNAME_XP_$ = "Cakewalk Express"
  316.     CONST PROGMANGROUPNAME_SS_$ = "Cakewalk Song Station"
  317.     CONST PROGNAME_VJB_$ = "VJB"
  318.     CONST SETUP_$ = "Setup"
  319.     CONST SetTitleFmt_$ = "\1 \2"
  320.     CONST setupMessage_$ = "Setup Message"
  321.     CONST setupProblem_$ = "Setup Problem"
  322.     CONST setupQuestion_$ = "Setup Question"
  323.     CONST winVerFmt_$ = "Sorry, but your Windows version is \1 and \2 requires at least Windows \3."
  324.     CONST cpuFmt_$ = "Sorry, but \1 requires at least an 80386 or higher CPU."
  325.     CONST mouseFmt_$ = "Please be aware that \1 requires a mouse for many operations."
  326.     CONST errQuitFmt_$ = "Installation failure.  Call \1 Technical Support."
  327.     CONST driveBase_$ = "A"        'drive letters start at this char
  328.     CONST dskSpcFmt_$ = "Sorry, \1 needs \2K bytes more (\3K total) on drive \4:.  Clear space or try a new path."
  329.     CONST userInfoNeedName_$ = "You must supply your name or Setup cannot proceed."
  330.     CONST assocConfirmFmt_$ = ".\1 files are currently associated with \2.  Switch association to \3?"
  331.     CONST PRODUCTNAME_VP_$ = "Virtual Piano"
  332.     CONST PRODUCTNAME_VJB_$ = "Virtual Jukebox"
  333.     CONST PRODUCTNAME_VJB_DEMO$ = "General MIDI Songs"
  334.     CONST RIFFUNK_DEMO$ = "Audio and MIDI Demo"
  335.     CONST instMustRestartWinFmt_$ = "\1 installed.  You must restart Windows before it can be used."
  336. '    CONST runWaveProfilerCaption_$ = "Run Wave Profiler"
  337. '    CONST runWaveProfilerMsg_$    = "Please run Wave Profiler to ensure proper operation between Windows digital audio devices and Cakewalk Pro Audio."
  338.  
  339. '==== Promotional DEMO Song ====
  340.  
  341.     CONST DEMO_DIR_$            = "DemoSong\"
  342.  
  343.     CONST DEMO2_SONG_$        = "50DEMO.BUN"
  344.     CONST DEMO2_DESC_$        = "Cakewalk Will Take You There"
  345.  
  346. '==== TECHniques ====
  347.  
  348.     CONST TECH_DIR_$            = "Techniqs\"
  349.  
  350.     CONST STR_TECH1_DESC_$    = "TECHniques #1 Watch Me First!"
  351.     CONST STR_TECH1_EXE_$    = "first.exe"
  352.  
  353.     CONST STR_TECH2_DESC_$    = "TECHniques #2 Overview"
  354.     CONST STR_TECH2_EXE_$    = "overview.exe"
  355.  
  356.     CONST STR_TECH3_DESC_$    = "TECHniques #3 Setup"
  357.     CONST STR_TECH3_EXE_$    = "setup.exe"
  358.  
  359.     CONST STR_TECH4_DESC_$    = "TECHniques #4 Recording Audio"
  360.     CONST STR_TECH4_EXE_$    = "audrecrd.exe"
  361.  
  362.     CONST STR_TECH5_DESC_$    = "TECHniques #5 Recording MIDI"
  363.     CONST STR_TECH5_EXE_$    = "recmidi.exe"
  364.  
  365.     CONST STR_TECH6_DESC_$    = "TECHniques #6 Parameters and Controls"
  366.     CONST STR_TECH6_EXE_$    = "control.exe"
  367.  
  368.     CONST STR_TECH7_DESC_$    = "TECHniques #7 How to Select"
  369.     CONST STR_TECH7_EXE_$    = "select.exe"
  370.  
  371. '==== Charlie Farren Tunes ====
  372.  
  373.     CONST FARREN_DIR_$        = "Farren\"
  374.  
  375.     CONST FARREN_SONG1_$        = "LOVE.BUN"
  376.     CONST FARREN_DESC1_$        = "Love Street - Charlie Farren"
  377.  
  378.     CONST FARREN_SONG2_$        = "ANIMAL.BUN"
  379.     CONST FARREN_DESC2_$        = "Animal Dance - Charlie Farren"
  380.  
  381.     CONST FARREN_PLAY3_$        = "FARREN.PLY"
  382.     CONST FARREN_DESC3_$        = "Charlie Farren Quick Audition"
  383.  
  384.     CONST FARREN_SONG4_$        = "LOVE_EX.BUN"
  385.     CONST FARREN_DESC4_$        = "Love Street - Charlie Farren"
  386.  
  387.     CONST FARREN_PLAY5_$        = "LOVE.PLY"
  388.     CONST FARREN_DESC5_$        = "Charlie Farren Quick Audition"
  389.  
  390. '==== Song Station ====
  391.  
  392.     CONST SS_CYBERCAT_DIR_$    = "Cybercat\"
  393.     CONST SS_SONGS_DIR_$        = "Songs\"
  394.     CONST SS_SOUNDS_DIR_$    = "Sounds\"
  395.  
  396.     CONST SS_CATDISP_$        = "CATDISP.EXE"
  397.     CONST SS_CATDISPX_$        = "Cakewalk Song Station"
  398.  
  399.     CONST SS_PLAY1_$            = "CAROLS\CAROLS.PLY"
  400.     CONST SS_DESC1_$            = "Holiday Carols"
  401.  
  402.     CONST SS_PLAY2_$            = "WEDDING\WEDDING.PLY"
  403.     CONST SS_DESC2_$            = "Wedding Songs"
  404.  
  405.     CONST SS_PLAY3_$            = "ANTHEMS\ANTHEMS.PLY"
  406.     CONST SS_DESC3_$            = "National Anthems"
  407.  
  408.     CONST SS_PLAY4_$            = "FOLK\FOLK.PLY"
  409.     CONST SS_DESC4_$            = "Folk Music"
  410.  
  411.     CONST SS_PLAY5_$            = "WORLD\WORLD.PLY"
  412.     CONST SS_DESC5_$            = "World Music"
  413.  
  414.     CONST SS_PLAY6_$            = "DANCE\DANCE.PLY"
  415.     CONST SS_DESC6_$            = "Dance Music"
  416.  
  417.     CONST SS_PLAY7_$            = "POP_JAZZ\POP_JAZZ.PLY"
  418.     CONST SS_DESC7_$            = "Pop and Jazz"
  419.  
  420.     CONST SS_PLAY8_$            = "CLASSCAL\CLASSCAL.PLY"
  421.     CONST SS_DESC8_$            = "Classical"
  422.  
  423.     CONST SS_PLAY9_$            = "JOPLIN\JOPLIN.PLY"
  424.     CONST SS_DESC9_$            = "Ragtime"
  425.  
  426.     CONST SS_PLAY10_$            = "SCIFI\SCIFI.PLY"
  427.     CONST SS_DESC10_$            = "Sci-Fi"
  428.  
  429.     CONST SS_PLAY11_$            = "ANIMAL\ANIMAL.PLY"
  430.     CONST SS_DESC11_$            = "Animals"
  431.  
  432.     CONST SS_PLAY12_$            = "TRANSPRT\TRANSPRT.PLY"
  433.     CONST SS_DESC12_$            = "Transportation"
  434.  
  435.     CONST SS_PLAY13_$            = "BACKGNDS\BACKGNDS.PLY"
  436.     CONST SS_DESC13_$            = "Backgrounds"
  437.  
  438.     CONST SS_PLAY14_$            = "MISCSFX\MISCSFX.PLY"
  439.     CONST SS_DESC14_$            = "Miscellaneous SFX"
  440.  
  441. '======== end LOCALIZATION ========
  442.  
  443.     CUIDLL$ = "mscuistf.dll"        'Custom user interface dll
  444.     HELPPROC$ = "FHelpDlgProc"        'Help dialog procedure
  445.  
  446.     'Determine full SETUP.INF path+name (same name for all products).
  447.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  448.     IF szInf$ = "" THEN
  449.         szInf$ = GetSymbolValue("STF_CWDDIR") + "SETUP.INF"
  450.     END IF
  451.     ReadInfFile szInf$
  452.  
  453.     'Determine which product we are by seeing which .EXE name reference key
  454.     'is defined.  In DSKLAYT we specified a reference key for the .EXE which
  455.     'is the same as PROGNAME$.  This key is also used for StampResource below.
  456.     IF DoesIniKeyExist(szInf$, "Files", """CAKEAUD""") <> 0 THEN
  457.         PROGNAME$ = "CAKEAUD"
  458.         PRODUCTNAME$ = PRODUCTNAME_PA_$
  459.         PROGMANGROUPNAME$ = PROGMANGROUPNAME_PA_$
  460.         INIBASENAME$ = "WINCAKE" 'Yes, this is the same PRO (for now).
  461.         DEST$ = "C:\CAKEAUD"
  462.     ELSEIF DoesIniKeyExist(szInf$, "Files", """CAKEDEMO""") <> 0 THEN
  463.         PROGNAME$ = "CAKEDEMO"
  464.         PRODUCTNAME$ = PRODUCTNAME_AD_$
  465.         PROGMANGROUPNAME$ = PROGMANGROUPNAME_PA_$
  466.         INIBASENAME$ = "WINCAKE" 'Yes, this is the same PRO (for now).
  467.         DEST$ = "C:\CAKEDEMO"
  468.     ELSEIF DoesIniKeyExist(szInf$, "Files", """WINCAKE""") <> 0 THEN
  469.         PROGNAME$ = "WINCAKE"
  470.         PRODUCTNAME$ = PRODUCTNAME_PR_$
  471.         PROGMANGROUPNAME$ = PROGMANGROUPNAME_PR_$
  472.         INIBASENAME$ = "WINCAKE"
  473.         DEST$ = "C:\CAKEPRO"
  474.     ELSEIF DoesIniKeyExist(szInf$, "Files", """WCWDEMO""") <> 0 THEN
  475.         PROGNAME$ = "WCWDEMO"
  476.         PRODUCTNAME$ = PRODUCTNAME_PD_$
  477.         PROGMANGROUPNAME$ = PROGMANGROUPNAME_PR_$
  478.         INIBASENAME$ = "WINCAKE"
  479.         DEST$ = "C:\WCWDEMO"
  480.     ELSEIF DoesIniKeyExist(szInf$, "Files", """CAKEHS""") <> 0 THEN
  481.         PROGNAME$ = "CAKEHS"
  482.         PRODUCTNAME$ = PRODUCTNAME_HS_$
  483.         PROGMANGROUPNAME$ = PROGMANGROUPNAME_HS_$
  484.         INIBASENAME$ = "CAKEHS"
  485.         DEST$ = "C:\CAKEHS"        'normal
  486.     ELSEIF DoesIniKeyExist(szInf$, "Files", """CHSDEMO""") <> 0 THEN
  487.         PROGNAME$ = "CHSDEMO"
  488.         PRODUCTNAME$ = PRODUCTNAME_HD_$
  489.         PROGMANGROUPNAME$ = PROGMANGROUPNAME_HS_$
  490.         INIBASENAME$ = "CAKEHS"
  491.         DEST$ = "C:\CHSDEMO"
  492.     ELSEIF DoesIniKeyExist(szInf$, "Files", """CAKEXP""") <> 0 THEN
  493.         PROGNAME$ = "CAKEXP"
  494.         PRODUCTNAME$ = PRODUCTNAME_XP_$
  495.         PROGMANGROUPNAME$ = PROGMANGROUPNAME_XP_$
  496.         INIBASENAME$ = "CAKEXP"
  497.         DEST$ = "C:\CAKEXP"        'normal
  498.     ELSEIF DoesIniKeyExist(szInf$, "Files", """CAKEXPD""") <> 0 THEN
  499.         PROGNAME$ = "CAKEXPD"
  500.         PRODUCTNAME$ = PRODUCTNAME_XD_$
  501.         PROGMANGROUPNAME$ = PROGMANGROUPNAME_XP_$
  502.         INIBASENAME$ = "CAKEXP"
  503.         DEST$ = "C:\CAKEXPD"
  504.     ELSEIF DoesIniKeyExist(szInf$, "Files", """CAKESS""") <> 0 THEN
  505.         PROGNAME$ = "CAKEXP"
  506.         PRODUCTNAME$ = PRODUCTNAME_SS_$
  507.         PROGMANGROUPNAME$ = PROGMANGROUPNAME_SS_$
  508.         INIBASENAME$ = "CAKEXP"
  509.         DEST$ = "C:\CAKEXP"        'normal
  510.     ELSE
  511.         GOTO ERRQUIT
  512.     END IF
  513.  
  514.     SetBitmap CUIDLL$, LOGO
  515.     SetTitle ArgStr$(SetTitleFmt_$, PRODUCTNAME$, SETUP_$, "", "")
  516.  
  517.     'Check Windows version.
  518.     winVerReqd$ = "3.1"
  519.     winVer$ = LTRIM$( STR$( GetWindowsMajorVersion() ) ) + "." + LTRIM$( STR$( GetWindowsMinorVersion() ) )
  520.     IF winVer$ < winVerReqd$ THEN        'string sort works
  521.         i% = DoMsgBox( ArgStr$(winVerFmt_$, winVer$, PRODUCTNAME$, winVerReqd$, ""), setupMessage_$, MB_OK+MB_TASKMODAL+MB_ICONHAND )
  522.         END    'exit SETUP
  523.     END IF
  524.  
  525.     'Check CPU.
  526.     cpu% = GetProcessorType()    '2==80286, 3==80386, 4==80486
  527.     IF cpu% < 3 THEN
  528.         i% = DoMsgBox( ArgStr$(cpuFmt_$, PRODUCTNAME$, "", "", ""), setupMessage_$, MB_OK+MB_TASKMODAL+MB_ICONSTOP )
  529.         END    'exit SETUP
  530.     END IF
  531.  
  532.     'Check for mouse.
  533.     IF HasMouseInstalled() = 0 THEN
  534.         i% = DoMsgBox( ArgStr$(mouseFmt_$, PRODUCTNAME$, "", "", ""), setupMessage_$, MB_OK+MB_TASKMODAL+MB_ICONINFORMATION )
  535.     END IF
  536.  
  537.     'Disk cost list symbols.
  538.     FILECOSTS$   = "FileCosts"
  539.     EXTRACOSTS$  = "ExtraCosts"
  540.     STILLNEEDED$ = "StillNeeded"
  541.     FOR i% = 1 TO 26 STEP 1
  542.         AddListItem EXTRACOSTS$, "0"
  543.     NEXT i%
  544.     'Add extra cost to Windows drive for ini/progman, etc.
  545.     ixWinDrive% = ASC(UCASE$( MID$(GetWindowsDir(), 1, 1) )) - ASC("A") + 1
  546.     ReplaceListItem EXTRACOSTS$, ixWinDrive%, "10240"
  547.  
  548.  
  549. WELCOME:
  550.     IF PRODUCTNAME$ = PRODUCTNAME_SS_$ THEN
  551.         dlg% = WELCOME_SS
  552.         dlghelp% = APPHELP_SS
  553.     ELSEIF PROGNAME$ = "CAKEAUD" THEN
  554.         dlg% = WELCOME_PA
  555.         dlghelp% = APPHELP_PA
  556.     ELSEIF PROGNAME$ = "CAKEDEMO" THEN
  557.         dlg% = WELCOME_AD
  558.         dlghelp% = APPHELP_AD
  559.     ELSEIF PROGNAME$ = "WINCAKE" THEN
  560.         dlg% = WELCOME_PR
  561.         dlghelp% = APPHELP_PR
  562.     ELSEIF PROGNAME$ = "WCWDEMO" THEN
  563.         dlg% = WELCOME_PD
  564.         dlghelp% = APPHELP_PD
  565.     ELSEIF PROGNAME$ = "CAKEHS" THEN
  566.         dlg% = WELCOME_HS
  567.         dlghelp% = APPHELP_HS
  568.     ELSEIF PROGNAME$ = "CHSDEMO" THEN
  569.         dlg% = WELCOME_HD
  570.         dlghelp% = APPHELP_HD
  571.     ELSEIF PROGNAME$ = "CAKEXP" THEN
  572.         dlg% = WELCOME_XP
  573.         dlghelp% = APPHELP_XP
  574.     ELSEIF PROGNAME$ = "CAKEXPD" THEN
  575.         dlg% = WELCOME_XD
  576.         dlghelp% = APPHELP_XD
  577.     END IF
  578.     sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfoDlgProc", dlghelp%, HELPPROC$)
  579.     IF sz$ = "CONTINUE" THEN
  580.         UIPop 1
  581.     ELSE
  582.         GOSUB ASKQUIT
  583.         GOTO WELCOME
  584.     END IF
  585.  
  586.  
  587. GETPATH:
  588.     SetSymbolValue "EditTextIn", DEST$
  589.     SetSymbolValue "EditFocus", "END"
  590. GETPATHL1:
  591.     sz$ = UIStartDlg(CUIDLL$, DESTPATH, "FEditDlgProc", dlghelp%, HELPPROC$)
  592.     DEST$ = GetSymbolValue("EditTextOut")
  593.  
  594.     IF sz$ = "CONTINUE" THEN
  595.         IF IsDirWritable(DEST$) = 0 THEN
  596.             GOSUB BADPATH
  597.             GOTO GETPATHL1
  598.         END IF
  599.         UIPop 1
  600.         ixAppDrive% = ASC(UCASE$( MID$(DEST$, 1, 1) )) - ASC(driveBase_$) + 1
  601.     ELSEIF sz$ = "REACTIVATE" THEN
  602.         GOTO GETPATHL1
  603.     ELSEIF sz$ = "BACK" THEN
  604.         UIPop 1
  605.         GOTO WELCOME
  606.     ELSE
  607.         GOSUB ASKQUIT
  608.         GOTO GETPATH
  609.     END IF
  610.  
  611. 'Install.
  612.     GOSUB INSTALL
  613.     IF StillNeed& > 0 THEN
  614.         GOTO GETPATH
  615.     END IF
  616.  
  617. QUIT:
  618.     ON ERROR GOTO ERRQUIT
  619.  
  620.     IF ERR = 0 THEN
  621.         IF PRODUCTNAME$ = PRODUCTNAME_SS_$ THEN
  622.             dlg% = EXITSUCCESS_SS
  623.         ELSEIF PROGNAME$ = "CAKEAUD" THEN
  624.             dlg% = EXITSUCCESS_PA
  625.         ELSEIF PROGNAME$ = "CAKEDEMO" THEN
  626.             dlg% = EXITSUCCESS_AD
  627.         ELSEIF PROGNAME$ = "WINCAKE" THEN
  628.             dlg% = EXITSUCCESS_PR
  629.         ELSEIF PROGNAME$ = "WCWDEMO" THEN
  630.             dlg% = EXITSUCCESS_PD
  631.         ELSEIF PROGNAME$ = "CAKEHS" THEN
  632.             dlg% = EXITSUCCESS_HS
  633.         ELSEIF PROGNAME$ = "CHSDEMO" THEN
  634.             dlg% = EXITSUCCESS_HD
  635.         ELSEIF PROGNAME$ = "CAKEXP" THEN
  636.             dlg% = EXITSUCCESS_XP
  637.         ELSEIF PROGNAME$ = "CAKEXPD" THEN
  638.             dlg% = EXITSUCCESS_XD
  639.         END IF
  640.     ELSEIF ERR = STFQUIT THEN
  641.         IF PRODUCTNAME$ = PRODUCTNAME_SS_$ THEN
  642.             dlg% = EXITQUIT_SS
  643.         ELSEIF PROGNAME$ = "CAKEAUD" THEN
  644.             dlg% = EXITQUIT_PA
  645.         ELSEIF PROGNAME$ = "CAKEDEMO" THEN
  646.             dlg% = EXITQUIT_AD
  647.         ELSEIF PROGNAME$ = "WINCAKE" THEN
  648.             dlg% = EXITQUIT_PR
  649.         ELSEIF PROGNAME$ = "WCWDEMO" THEN
  650.             dlg% = EXITQUIT_PD
  651.         ELSEIF PROGNAME$ = "CAKEHS" THEN
  652.             dlg% = EXITQUIT_HS
  653.         ELSEIF PROGNAME$ = "CHSDEMO" THEN
  654.             dlg% = EXITQUIT_HD
  655.         ELSEIF PROGNAME$ = "CAKEXP" THEN
  656.             dlg% = EXITQUIT_XP
  657.         ELSEIF PROGNAME$ = "CAKEXPD" THEN
  658.             dlg% = EXITQUIT_XD
  659.         END IF
  660.     ELSE
  661.         dlg% = EXITFAILURE
  662.     END IF
  663. QUITL1:
  664.     sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfo0DlgProc", 0, "")
  665.     IF sz$ = "REACTIVATE" THEN
  666.         GOTO QUITL1
  667.     END IF
  668.     UIPop 1
  669.  
  670.     END
  671.  
  672. ERRQUIT:
  673.     i% = DoMsgBox(ArgStr$(errQuitFmt_$, COMPANY_$, "", "", ""), setupMessage_$, MB_OK+MB_TASKMODAL+MB_ICONHAND)
  674.     END
  675.  
  676.  
  677.  
  678. BADPATH:
  679.     sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfo0DlgProc", 0, "")
  680.     IF sz$ = "REACTIVATE" THEN
  681.         GOTO BADPATH
  682.     END IF
  683.     UIPop 1
  684.     RETURN
  685.  
  686.  
  687.  
  688. ASKQUIT:
  689.     sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
  690.  
  691.     IF sz$ = "EXIT" THEN
  692.         UIPopAll
  693.         ERROR STFQUIT
  694.     ELSEIF sz$ = "REACTIVATE" THEN
  695.         GOTO ASKQUIT
  696.     ELSE
  697.         UIPop 1
  698.     END IF
  699.     RETURN
  700.  
  701.  
  702.  
  703. '**
  704. '**    Purpose:
  705. '**        Builds the copy list and performs all installation operations.
  706. '**    Arguments:
  707. '**        none.
  708. '**    Returns:
  709. '**        none.
  710. '*************************************************************************
  711. INSTALL:
  712.  
  713.     'Get user information; we'll stamp later.
  714.     GOSUB DOUSERINFODIALOG
  715.  
  716.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  717.  
  718.     'These (normal) files go to the user's specifed app destination directory.
  719.     AddSectionFilesToCopyList "Files", SrcDir$, DEST$
  720.  
  721.     'These files go to the Windows System directory.
  722.     AddSectionFilesToCopyList "system", SrcDir$, GetWindowsSysDir()
  723.  
  724.     StillNeed& = GetCopyListCost(EXTRACOSTS$, FILECOSTS$, STILLNEEDED$)
  725.     IF StillNeed& > 0 THEN
  726.         ClearCopyList
  727.         FOR ix% = 1 TO 26 STEP 1    'find first drive that needs space
  728.             need1& = VAL(GetListItem(STILLNEEDED$, ix%))
  729.             IF need1& > 0 THEN
  730.                 GOTO FNDDRV
  731.             END IF
  732.         NEXT ix%
  733.         ix = ixAppDrive                '(shouldn't happen)
  734.         need1& = 0
  735.         StillNeed& = 1
  736. FNDDRV:
  737.         need$  = LTRIM$(STR$( (need1&+1023) / 1024 ))
  738.         cost$  = LTRIM$(STR$( (VAL(GetListItem(FILECOSTS$, ix%))+1023) / 1024 ))
  739.         drive$ = CHR$(ix% - 1 + ASC(driveBase_$))
  740.         msg$ = ArgStr$(dskSpcFmt_$, PRODUCTNAME$, need$, cost$, drive$)
  741.         i% = DoMsgBox(msg$, setupProblem_$, MB_RETRYCANCEL+MB_TASKMODAL+MB_ICONHAND)
  742.         IF i% = IDCANCEL THEN
  743.             GOSUB ASKQUIT
  744.         END IF
  745.         RETURN        'must RETURN out of GOSUB to pop stack, not just GOTO
  746.     END IF
  747.  
  748.     CreateDir DEST$, cmoNone
  749.  
  750.     OpenLogFile MakePath(DEST$, "LOGFILE.OUT"), 0
  751.     WriteToLogFile ""
  752.     WriteToLogFile "User chose as destination directory: '" + DEST$ + "'"
  753.     WriteToLogFile "May have had to create the directory: " + DEST$
  754.     WriteToLogFile ""
  755.  
  756.     CopyFilesInCopyList
  757.  
  758.     'Important: Do this here before any dialogs with an Exit button, so
  759.     'user cannot avoid stamping.
  760.     GOSUB STAMPUSERINFO
  761.  
  762.     SetRegKeyValue PROGNAME$, PRODUCTNAME$
  763.     SetRegKeyValue PROGNAME$+"\shell\print", ""
  764.     SetRegKeyValue PROGNAME$+"\shell\open\command", MakePath(DEST$,PROGNAME$+".EXE") + " %1"
  765.  
  766.     MaybeAssociate "wrk"
  767.     MaybeAssociate "mid"
  768.     MaybeAssociate "mff"
  769.     MaybeAssociate "tpl"
  770.     MaybeAssociate "bun"
  771.  
  772.     SetRegKeyValue PROGNAME_VJB_$, PRODUCTNAME_VJB_$
  773.     SetRegKeyValue PROGNAME_VJB_$+"\shell\print", ""
  774.     SetRegKeyValue PROGNAME_VJB_$+"\shell\open\command", MakePath(DEST$,PROGNAME_VJB_$+".EXE") + " %1"
  775.  
  776.     MaybeAssociateVJB "ply"
  777.  
  778.     'IF PROGNAME$ = "CAKEAUD" THEN
  779.     'MaybeAssociateVJB "set"
  780.     'ELSEIF PROGNAME$ = "WINCAKE" THEN
  781.     'MaybeAssociateVJB "set"
  782.  
  783.     IF PROGNAME$ = "CAKEHS" THEN
  784.     MaybeAssociateVJB "set"
  785.     ELSEIF PROGNAME$ = "CAKEXP" THEN
  786.     MaybeAssociateVJB "set"
  787.     END IF
  788.  
  789. 'Deal with old installation where our app DLL's were in WINDOWS\SYSTEM.
  790. 'No more need to delete old DLL's, since we don't use any with same name now.
  791. 'If old TTSSEQ.INI exists in sysdir but not in appdir, copy it now to preserve settings.
  792.     SysDir$ = GetWindowsSysDir()
  793.     IF DoesFileExist(SysDir$+"TTSSEQ.INI",femExists) <> 0 AND DoesFileExist(DEST$+"TTSSEQ.INI",femExists) = 0 THEN
  794.         CopyFile SysDir$+"TTSSEQ.INI", DEST$+"\TTSSEQ.INI", cmoNone, 0
  795.     END IF
  796.  
  797. 'If this product includes sysx input support, then it includes DRM.INI, which
  798. 'is the base version of progname.INI containing just the DRM's.
  799. 'So if this product includes DRM.INI, then copy it to progname.INI, except if
  800. 'progname.INI already exists, in which case we inform the user that we didn't
  801. 'overwrite it and he might want to look for new DRM's in DRM.INI.
  802.     drm$ = MakePath(DEST$, "DRM.INI")
  803.     ini$ = MakePath(DEST$, INIBASENAME$+".INI")
  804.     IF DoesFileExist(drm$,femExists) <> 0 THEN    'if this product includes DRM.INI
  805.         IF DoesFileExist(ini$,femExists) = 0 THEN
  806.             CopyFile drm$, ini$, cmoVital, 0
  807.         ELSE
  808.             sz$ = UIStartDlg(CUIDLL$, INI_NOT_OVERWRITTEN, "FInfoDlgProc", 0, "")
  809.             IF sz$ = "EXIT" THEN
  810.                 GOSUB ASKQUIT
  811.             ELSE
  812.                 UIPop 1
  813.             END IF
  814.         END IF
  815.     END IF
  816.  
  817. 'SRC.INS (complete .INS) was copied over with no name change.
  818. 'DEFAULT.INS (basic default .INS) will be copied to MASTER.INS, which is
  819. 'what the program actually uses, but only if it doesn't already exist.
  820.     default$ = MakePath(DEST$, "DEFAULT.INS")
  821.     master$  = MakePath(DEST$, "MASTER.INS")
  822.     IF DoesFileExist(master$,femExists) = 0 THEN
  823.         CopyFile default$, master$, cmoVital, 0
  824.     ELSE
  825.         sz$ = UIStartDlg(CUIDLL$, INS_NOT_OVERWRITTEN, "FInfoDlgProc", 0, "")
  826.         IF sz$ = "EXIT" THEN
  827.             GOSUB ASKQUIT
  828.         ELSE
  829.             UIPop 1
  830.         END IF
  831.     END IF
  832.  
  833. 'If this product includes chord library support, then it includes CHORDNEW.LIW,
  834. 'which is the base version of the chord library.  The program uses CHORDS.LIW.
  835. 'So if this product includes CHORDNEW.LIW, then copy it to CHORDS.LIW, except if
  836. 'CHORDS.LIW already exists, in which case we inform the user that we didn't
  837. 'overwrite it and he might want to import the new chords from CHORDNEW.LIW.
  838.     new$ = MakePath(DEST$, "CHORDNEW.LIW")
  839.     use$ = MakePath(DEST$, "CHORDS.LIW")
  840.     IF DoesFileExist(new$,femExists) <> 0 THEN    'if this product includes CHORDSNEW.LIW
  841.         IF DoesFileExist(use$,femExists) = 0 THEN
  842.             CopyFile new$, use$, cmoVital, 0
  843.         ELSE
  844.             sz$ = UIStartDlg(CUIDLL$, CHORDS_NOT_OVERWRITTEN, "FInfoDlgProc", 0, "")
  845.             IF sz$ = "EXIT" THEN
  846.                 GOSUB ASKQUIT
  847.             ELSE
  848.                 UIPop 1
  849.             END IF
  850.         END IF
  851.     END IF
  852.  
  853.     CreateProgmanGroup PROGMANGROUPNAME$, "", cmoNone
  854.     ShowProgmanGroup  PROGMANGROUPNAME$, 1, cmoNone
  855.  
  856. '==== Take care of special case Song Station. ====
  857.  
  858.     IF PRODUCTNAME$ = PRODUCTNAME_SS_$ THEN
  859.         szPath$ = MID$( GetSymbolValue("STF_SRCDIR"), 1, 1 ) + ":\"
  860.         IF DoesFileExist( MakePath( szPath$, SS_CYBERCAT_DIR_$+SS_CATDISP_$ ), femExists ) THEN
  861.             CreateProgmanItem PROGMANGROUPNAME$, SS_CATDISPX_$, MakePath( szPath$, SS_CYBERCAT_DIR_$+SS_CATDISP_$ ), "", cmoOverwrite
  862.         END IF
  863.         CreateProgmanItem PROGMANGROUPNAME$, PRODUCTNAME_XP_$, MakePath(DEST$,PROGNAME$+".EXE"), "", cmoOverwrite
  864.     ELSE
  865.         CreateProgmanItem PROGMANGROUPNAME$, PRODUCTNAME$, MakePath(DEST$,PROGNAME$+".EXE"), "", cmoOverwrite
  866.     END IF
  867.  
  868. '==== Riff Funk ====
  869.  
  870.     IF DoesFileExist( MakePath(DEST$,"RIFFUNK.BUN"), femExists ) THEN
  871.         CreateProgmanItem PROGMANGROUPNAME$, RIFFUNK_DEMO$, MakePath(DEST$,PROGNAME$+" RIFFUNK.BUN" ), "", cmoOverwrite
  872.     END IF
  873.  
  874.     IF DoesFileExist( MakePath(DEST$,"RIFFUNKX.BUN"), femExists ) THEN
  875.         CreateProgmanItem PROGMANGROUPNAME$, RIFFUNK_DEMO$, MakePath(DEST$,PROGNAME$+" RIFFUNKX.BUN" ), "", cmoOverwrite
  876.     END IF
  877.  
  878. '==== Virtual Jukebox ====
  879.  
  880.     CreateProgmanItem PROGMANGROUPNAME$, PRODUCTNAME_VJB_$, MakePath(DEST$,"VJB.EXE"), "", cmoOverwrite
  881.     CreateProgmanItem PROGMANGROUPNAME$, PRODUCTNAME_VJB_DEMO$, MakePath(DEST$,"VJB DEMO.PLY"), "", cmoOverwrite
  882.  
  883.     WriteToLogFile ""
  884.  
  885. '==== Virtual Piano ====
  886.  
  887.     GOSUB INSTALL_VPIANO
  888.  
  889. '==== README ====
  890.  
  891.     CreateProgmanItem PROGMANGROUPNAME$, "README.WRI", "write.exe "+MakePath(DEST$,"README.WRI"), "", cmoOverwrite
  892.  
  893. '==== Install ICONS for Song Station or CD-ROM Edition icons. ====
  894.  
  895.     IF PRODUCTNAME$ = PRODUCTNAME_SS_$ THEN
  896.         GOSUB INSTALL_SS_ICONS
  897.     ELSE
  898.         GOSUB MAYBE_CDROM
  899.     END IF
  900.  
  901.     WriteToLogFile "SUB Install completed."
  902.     CloseLogFile
  903.  
  904.     RETURN
  905.  
  906. '**
  907. '**    Purpose:
  908. '**        Install a file without replacing an existing one.
  909. '**    Arguments:
  910. '**        szShort$ - Name like SRC.INS
  911. '**        szLong$     - Name like MASTER.INS
  912. '*************************************************************************
  913. SUB SafeCopy (szShort$, szLong$) STATIC
  914.     szShortPathName$ = MakePath(DEST$, szShort$)
  915.     szLongPathName$ = MakePath(DEST$, szLong$)
  916.     IF DoesFileExist(szLongPathName$,femExists) = 0 THEN
  917.         CopyFile szShortPathName$, szLongPathName$, cmoVital, 0
  918.     END IF
  919. END SUB
  920.  
  921.  
  922.  
  923. '**
  924. '**    Purpose:
  925. '**        Appends a file name to the end of a directory path,
  926. '**        inserting a backslash character as needed.
  927. '**    Arguments:
  928. '**        szDir$  - full directory path (with optional ending "\")
  929. '**        szFile$ - filename to append to directory
  930. '**    Returns:
  931. '**        Resulting fully qualified path name.
  932. '*************************************************************************
  933. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  934.     IF szDir$ = "" THEN
  935.         MakePath = szFile$
  936.     ELSEIF szFile$ = "" THEN
  937.         MakePath = szDir$
  938.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  939.         MakePath = szDir$ + szFile$
  940.     ELSE
  941.         MakePath = szDir$ + "\" + szFile$
  942.     END IF
  943. END FUNCTION
  944.  
  945.  
  946.  
  947. '**
  948. '**    Purpose:
  949. '**    Arguments:
  950. '**    Returns:
  951. '**        none.
  952. '*************************************************************************
  953. DOUSERINFODIALOG:
  954. 'Get user info for stamping later.
  955.     IF PROGNAME$ <> "CAKEDEMO" AND PROGNAME$ <> "WCWDEMO" AND PROGNAME$ <> "CHSDEMO" AND PROGNAME$ <> "CAKEXPD" THEN
  956. GETUSERINFO:
  957.         sz$ = UIStartDlg(CUIDLL$, USERINFO, "FNameOrgDlgProc", dlghelp%, HELPPROC$)
  958.         IF sz$ = "REACTIVATE" THEN
  959.             GOTO GETUSERINFO
  960.         END IF
  961.  
  962.         szUser$ = GetSymbolValue( "NameOut" )
  963.         szCo$ = GetSymbolValue( "OrgOut" )
  964.  
  965.         'Company may be blank, but not the other two.
  966.         IF szUser$ = "" THEN
  967.             i% = DoMsgBox(userInfoNeedName_$, setupProblem_$, MB_OK+MB_TASKMODAL+MB_ICONHAND)
  968.             GOTO GETUSERINFO
  969.         END IF
  970.  
  971.         'Dismiss dialog now that we've validated.
  972.         UIPop 1
  973.     END IF
  974.  
  975.     RETURN
  976.  
  977.  
  978. '**
  979. '**    Purpose:
  980. '**    Arguments:
  981. '**    Returns:
  982. '**        none.
  983. '*************************************************************************
  984. STAMPUSERINFO:
  985. 'Stamp user info into our .EXE file.
  986.     IF PROGNAME$ <> "CAKEDEMO" AND PROGNAME$ <> "WCWDEMO" AND PROGNAME$ <> "CHSDEMO" AND PROGNAME$ <> "CAKEXPD" THEN
  987.  
  988.         'szUser$ szCo$ were prompted for above.
  989.  
  990.         szDat$ = CHR$(LEN(szUser$)) + szUser$
  991.         szDat$ = szDat$ + CHR$(LEN(szCo$)) + szCo$
  992.  
  993.         '"Files" is the section name in our .INF file of the .EXE file.
  994.         '
  995.         '6 is the resource type for STRINGTABLE entries.
  996.         '
  997.         '&H401 is the upper 12 bits of IDS_USERNAME (0x4000) + 1.
  998.         '
  999.         'In DSKLAYT we specified a reference key for the .EXE which
  1000.         'is the same as PROGNAME$.
  1001.         'The ONLY exception is SONG STATION.
  1002.  
  1003.         IF PRODUCTNAME$ = PRODUCTNAME_SS_$ THEN
  1004.             StampResource "Files","CAKESS",DEST$,6,&H401,szDat$,LEN(szDat$)
  1005.         ELSE
  1006.             StampResource "Files",PROGNAME$,DEST$,6,&H401,szDat$,LEN(szDat$)
  1007.         ENDIF
  1008.     END IF
  1009.  
  1010.     RETURN
  1011.  
  1012.  
  1013. '**
  1014. '**    Purpose:
  1015. '**        Associates given filetype with us, but asks for user confirmation
  1016. '**        if already set to something else.
  1017. '**    Arguments:
  1018. '**        szExt$ - filetype extension, e.g. "mid"
  1019. '**    Returns:
  1020. '**        none.
  1021. '*************************************************************************
  1022. SUB MaybeAssociate (szExt$) STATIC
  1023.     oldProg$ = ""
  1024.     ok% = IDYES
  1025.  
  1026. 'Check Registration Database (overrides WIN.INI [Extensions]).
  1027.  
  1028.     oldCmd$ = UCASE$( LTRIM$( GetRegKeyValue("."+szExt$+"\shell\open\command") ) )
  1029.     IF oldCmd$ = "" THEN    'didn't find direct association, check via prog name
  1030.         oldProg$ = LTRIM$( RTRIM$( GetRegKeyValue("."+szExt$) ) )
  1031.         IF oldProg$ <> "" THEN
  1032.             oldCmd$ = UCASE$( LTRIM$( GetRegKeyValue(oldProg$+"\shell\open\command") ) )
  1033.             oldProduct$ = LTRIM$( RTRIM$( GetRegKeyValue(oldProg$) ) )
  1034.             IF oldProduct$ <> "" THEN    'long product name found, use it
  1035.                 oldProg$ = oldProduct$
  1036.             END IF
  1037.         END IF
  1038.     END IF
  1039.     IF oldCmd$ <> "" THEN
  1040.         IF INSTR(oldCmd$, PROGNAME$+".EXE") = 0 THEN    'not us, must confirm
  1041.             IF oldProg$ = "" THEN   'no short or long name, parse command string
  1042.                 j% = INSTR(oldCmd$, " ")
  1043.                 IF j% > 1 THEN
  1044.                     oldProg$ = MID$(oldCmd$, 1, j%-1)
  1045.                 ELSE
  1046.                     oldProg$ = oldCmd$
  1047.                 END IF
  1048.             END IF
  1049.         ELSE                    'it's us, clear oldProg$ => no confirm
  1050.             oldProg$ = ""
  1051.         END IF
  1052.         GOTO MAYBE_CONFIRM        'found association, no need to examine WIN.INI
  1053.     END IF
  1054.  
  1055. 'Check WIN.INI [Extensions].
  1056.  
  1057.     oldCmd$ = UCASE$( LTRIM$( GetIniKeyString("WIN.INI","Extensions",szExt$) ) )
  1058.     IF oldCmd$ <> "" THEN
  1059.         IF INSTR(oldCmd$, PROGNAME$+".EXE") = 0 THEN    'not us, must confirm
  1060.             j% = INSTR(oldCmd$, " ")
  1061.             IF j% > 1 THEN
  1062.                 oldProg$ = MID$(oldCmd$, 1, j%-1)
  1063.             ELSE
  1064.                 oldProg$ = oldCmd$
  1065.             END IF
  1066.         END IF
  1067.     END IF
  1068.  
  1069. 'Get user confirmation if necessary, and do the association if ok.
  1070.  
  1071. MAYBE_CONFIRM:
  1072.     IF oldProg$ <> "" THEN
  1073.         ok% = DoMsgBox(ArgStr$(assocConfirmFmt_$, UCASE$(szExt$), oldProg$, PRODUCTNAME$, ""), setupQuestion_$, MB_YESNO+MB_TASKMODAL+MB_ICONQUESTION)
  1074.     END IF
  1075.  
  1076.     IF ok% = IDYES THEN
  1077.         DeleteRegKey   "."+szExt$    'delete all keys for any old direct association
  1078.         SetRegKeyValue "."+szExt$, PROGNAME$
  1079.         CreateIniKeyValue "WIN.INI", "Extensions", szExt$, MakePath(DEST$,PROGNAME$+".EXE") + " ^." + szExt$, cmoOverwrite
  1080.     END IF
  1081.  
  1082. END SUB
  1083.  
  1084. '**
  1085. '**    Purpose:
  1086. '**        VIRTUAL JUKEBOX
  1087. '**        Associates given filetype with us, but asks for user confirmation
  1088. '**        if already set to something else.
  1089. '**    Arguments:
  1090. '**        szExt$ - filetype extension, e.g. "ply" or "set"
  1091. '**    Returns:
  1092. '**        none.
  1093. '*************************************************************************
  1094. SUB MaybeAssociateVJB (szExt$) STATIC
  1095.     oldProg$ = ""
  1096.     ok% = IDYES
  1097.  
  1098. 'Check Registration Database (overrides WIN.INI [Extensions]).
  1099.  
  1100.     oldCmd$ = UCASE$( LTRIM$( GetRegKeyValue("."+szExt$+"\shell\open\command") ) )
  1101.     IF oldCmd$ = "" THEN    'didn't find direct association, check via prog name
  1102.         oldProg$ = LTRIM$( RTRIM$( GetRegKeyValue("."+szExt$) ) )
  1103.         IF oldProg$ <> "" THEN
  1104.             oldCmd$ = UCASE$( LTRIM$( GetRegKeyValue(oldProg$+"\shell\open\command") ) )
  1105.             oldProduct$ = LTRIM$( RTRIM$( GetRegKeyValue(oldProg$) ) )
  1106.             IF oldProduct$ <> "" THEN    'long product name found, use it
  1107.                 oldProg$ = oldProduct$
  1108.             END IF
  1109.         END IF
  1110.     END IF
  1111.     IF oldCmd$ <> "" THEN
  1112.         IF INSTR(oldCmd$, PROGNAME_VJB_$+".EXE") = 0 THEN    'not us, must confirm
  1113.             IF oldProg$ = "" THEN   'no short or long name, parse command string
  1114.                 j% = INSTR(oldCmd$, " ")
  1115.                 IF j% > 1 THEN
  1116.                     oldProg$ = MID$(oldCmd$, 1, j%-1)
  1117.                 ELSE
  1118.                     oldProg$ = oldCmd$
  1119.                 END IF
  1120.             END IF
  1121.         ELSE                    'it's us, clear oldProg$ => no confirm
  1122.             oldProg$ = ""
  1123.         END IF
  1124.         GOTO MAYBE_CONFIRM        'found association, no need to examine WIN.INI
  1125.     END IF
  1126.  
  1127. 'Check WIN.INI [Extensions].
  1128.  
  1129.     oldCmd$ = UCASE$( LTRIM$( GetIniKeyString("WIN.INI","Extensions",szExt$) ) )
  1130.     IF oldCmd$ <> "" THEN
  1131.         IF INSTR(oldCmd$, PROGNAME_VJB_$+".EXE") = 0 THEN    'not us, must confirm
  1132.             j% = INSTR(oldCmd$, " ")
  1133.             IF j% > 1 THEN
  1134.                 oldProg$ = MID$(oldCmd$, 1, j%-1)
  1135.             ELSE
  1136.                 oldProg$ = oldCmd$
  1137.             END IF
  1138.         END IF
  1139.     END IF
  1140.  
  1141. 'Get user confirmation if necessary, and do the association if ok.
  1142.  
  1143. MAYBE_CONFIRM:
  1144.     IF oldProg$ <> "" THEN
  1145.         ok% = DoMsgBox(ArgStr$(assocConfirmFmt_$, UCASE$(szExt$), oldProg$, PRODUCTNAME_VJB_$, ""), setupQuestion_$, MB_YESNO+MB_TASKMODAL+MB_ICONQUESTION)
  1146.     END IF
  1147.  
  1148.     IF ok% = IDYES THEN
  1149.         DeleteRegKey   "."+szExt$    'delete all keys for any old direct association
  1150.         SetRegKeyValue "."+szExt$, PROGNAME_VJB_$
  1151.         CreateIniKeyValue "WIN.INI", "Extensions", szExt$, MakePath(DEST$,PROGNAME_VJB_$+".EXE") + " ^." + szExt$, cmoOverwrite
  1152.     END IF
  1153.  
  1154. END SUB
  1155.  
  1156. '**
  1157. '**    Purpose:
  1158. '**        Installs Virtual Piano and its driver, if part of this product.
  1159. '**    Arguments:
  1160. '**        none.
  1161. '**    Returns:
  1162. '**        none.
  1163. '*************************************************************************
  1164. INSTALL_VPIANO:
  1165.  
  1166. 'If this product doesn't include the Virtual Piano, return now.
  1167. '(Currently all products include it.)
  1168.  
  1169. 'Set up the Virtual Piano program icon.
  1170.  
  1171.     CreateProgmanItem PROGMANGROUPNAME$, PRODUCTNAME_VP_$, MakePath(DEST$,"VPIANO.EXE"), "", cmoOverwrite
  1172.  
  1173. 'Display message that it was installed and Windows should be restarted.
  1174.  
  1175.     i% = DoMsgBox( ArgStr$(instMustRestartWinFmt_$, PRODUCTNAME_VP_$, "", "", ""), setupMessage_$, MB_OK+MB_TASKMODAL+MB_ICONINFORMATION )
  1176.  
  1177. 'If there's already a SYSTEM.INI [drivers] MIDIn key set to us, we're done.
  1178. 'Else find next available SYSTEM.INI [drivers] MIDIn key.
  1179.  
  1180.     szSysIni$ = GetWindowsDir()+"SYSTEM.INI"
  1181.     szSect$ = "drivers"
  1182.     szValue$ = "vpiano.drv"
  1183.     szKey$ = "MIDI99"
  1184.  
  1185.     FOR i% = 0 TO 98 STEP 1
  1186.         IF i% = 0 THEN
  1187.             szKeyThis$ = "MIDI"
  1188.         ELSE
  1189.             szKeyThis$ = "MIDI" + LTRIM$( STR$(i%) )
  1190.             END IF
  1191.  
  1192.         szOldValue$ = LCASE$( GetIniKeyString(szSysIni$,szSect$,szKeyThis$) )
  1193.         IF szOldValue$ = szValue$ THEN
  1194.             RETURN                    'already set, we're done
  1195.         ELSEIF szOldValue$ = "" AND szKey$ = "MIDI99" THEN
  1196.             szKey$ = szKeyThis$        'found next key, remember it
  1197.         END IF
  1198.     NEXT i%
  1199.  
  1200. 'Found next available SYSTEM.INI [drivers] MIDIn key.  Set it to point to us.
  1201.  
  1202.     CreateIniKeyValue szSysIni$, szSect$, szKey$, szValue$, cmoNone
  1203.  
  1204.     RETURN
  1205.  
  1206.  
  1207.  
  1208. '**
  1209. '**    Purpose:
  1210. '**        Give user option of running Wave Profiler.
  1211. '**    Arguments:
  1212. '**        none.
  1213. '**    Returns:
  1214. '**        none.
  1215. '*************************************************************************
  1216. REMIND_RUN_WAVE_PROFILER:
  1217.  
  1218. 'If this product doesn't include Wave Profiler, return now.
  1219. '(Currently just Pro Audio includes it.)
  1220.  
  1221.     i% = DoMsgBox( runWaveProfilerMsg_$, runWaveProfilerCaption_$, MB_OK+MB_TASKMODAL+MB_ICONINFORMATION )
  1222.     RETURN
  1223.  
  1224.  
  1225. '**
  1226. '**    Purpose:
  1227. '**        Substitutes string args by number into a format string.
  1228. '**        Useful for localization, since arg order is now controlled by Fmt$.
  1229. '**        The backslash is used as an escape char.
  1230. '**        A backslash followed by a digit string substitutes that arg num.
  1231. '**        A backslash not followed by digits subs in the next literal char.
  1232. '**    Arguments:
  1233. '**        Fmt$  - format string containing instances of \N, N is arg num
  1234. '**        ArgN$ - string arg to sub in for each instance of \N
  1235. '**    Returns:
  1236. '**        Final output string with all arg substitution done.
  1237. '**    Example:
  1238. '**        Fmt$ = "\\1 = \1, \\2 = \2, \\3 = \3, \\Z = \Z, \\11 = \11."
  1239. '**        Out$ = ArgStr$(Fmt$, "Arg1", "Arg2", "", "")
  1240. '**        REM ...This sets Out$ to "\1 = Arg1, \2 = Arg2, \3 = , \Z = Z, \11 = ."
  1241. '*************************************************************************
  1242. FUNCTION ArgStr$ (Fmt$, Arg1$, Arg2$, Arg3$, Arg4$) STATIC
  1243.  
  1244.     rtn$ = Fmt$        'our returned output string is built here
  1245.     esc$ = "\"        'this is the esc char we use
  1246.     i% = 1            'current index into string
  1247.  
  1248.     WHILE 1
  1249.         i% = INSTR(i%, rtn$, esc$)    'loc of next esc char
  1250.         IF i% = 0 THEN
  1251.             EXIT WHILE                'no more esc chars, quit
  1252.         END IF
  1253.         j% = i% + 1
  1254.         WHILE j% <= LEN(rtn$) AND INSTR("0123456789", MID$(rtn$, j%, 1)) <> 0
  1255.             j% = j% + 1
  1256.         WEND                'i%+1 is start of number string, j% is end+1
  1257.         IF j% = i% + 1 THEN    'digit string empty, drop esc char and take next char as literal
  1258.             rtn$ = MID$(rtn$, 1, i% - 1) + MID$(rtn$, j%)
  1259.             i% = i% + 1                'next search pos in string
  1260.         ELSE                'digit string non-empty, read int and sub in arg
  1261.             num% = VAL(MID$(rtn$, i% + 1, j% - i% - 1))
  1262.             SELECT CASE num%
  1263.             CASE 1
  1264.                 Arg$ = Arg1$
  1265.             CASE 2
  1266.                 Arg$ = Arg2$
  1267.             CASE 3
  1268.                 Arg$ = Arg3$
  1269.             CASE 4
  1270.                 Arg$ = Arg4$
  1271.             CASE ELSE
  1272.                 Arg$ = ""
  1273.             END SELECT
  1274.             rtn$ = MID$(rtn$, 1, i% - 1) + Arg$ + MID$(rtn$, j%)
  1275.             i% = i% + LEN(Arg$)        'next search pos in string
  1276.         END IF
  1277.     WEND
  1278.  
  1279.     ArgStr$ = rtn$
  1280.  
  1281. END FUNCTION
  1282.  
  1283.  
  1284. '**
  1285. '**    Purpose:
  1286. '**        Installs Techniques icons, if movie files exist.
  1287. '**    Arguments:
  1288. '**        none.
  1289. '**    Returns:
  1290. '**        none.
  1291. '**    WARNING:
  1292. '**        The current method used here only works with Windows 3.1!
  1293. '*************************************************************************
  1294. MAYBE_CDROM:
  1295.  
  1296. 'Determine drive letter.  Techniques is subdir off drive root.
  1297.  
  1298.     szPath$ = MID$( GetSymbolValue("STF_SRCDIR"), 1, 1 ) + ":\"
  1299.  
  1300.     IF DoesFileExist( MakePath( szPath$, TECH_DIR_$+STR_TECH1_EXE_$ ), femExists ) THEN
  1301.         CreateProgmanItem PROGMANGROUPNAME$, STR_TECH1_DESC_$, MakePath( szPath$, TECH_DIR_$+STR_TECH1_EXE_$ ), "", cmoOverwrite
  1302.     END IF
  1303.  
  1304.     IF DoesFileExist( MakePath( szPath$, TECH_DIR_$+STR_TECH2_EXE_$ ), femExists ) THEN
  1305.         CreateProgmanItem PROGMANGROUPNAME$, STR_TECH2_DESC_$, MakePath( szPath$, TECH_DIR_$+STR_TECH2_EXE_$ ), "", cmoOverwrite
  1306.     END IF
  1307.  
  1308.     IF DoesFileExist( MakePath( szPath$, TECH_DIR_$+STR_TECH3_EXE_$ ), femExists ) THEN
  1309.         CreateProgmanItem PROGMANGROUPNAME$, STR_TECH3_DESC_$, MakePath( szPath$, TECH_DIR_$+STR_TECH3_EXE_$ ), "", cmoOverwrite
  1310.     END IF
  1311.  
  1312.     IF DoesFileExist( MakePath( szPath$, TECH_DIR_$+STR_TECH4_EXE_$ ), femExists ) THEN
  1313.         CreateProgmanItem PROGMANGROUPNAME$, STR_TECH4_DESC_$, MakePath( szPath$, TECH_DIR_$+STR_TECH4_EXE_$ ), "", cmoOverwrite
  1314.     END IF
  1315.  
  1316.     IF DoesFileExist( MakePath( szPath$, TECH_DIR_$+STR_TECH5_EXE_$ ), femExists ) THEN
  1317.         CreateProgmanItem PROGMANGROUPNAME$, STR_TECH5_DESC_$, MakePath( szPath$, TECH_DIR_$+STR_TECH5_EXE_$ ), "", cmoOverwrite
  1318.     END IF
  1319.  
  1320.     IF DoesFileExist( MakePath( szPath$, TECH_DIR_$+STR_TECH6_EXE_$ ), femExists ) THEN
  1321.         CreateProgmanItem PROGMANGROUPNAME$, STR_TECH6_DESC_$, MakePath( szPath$, TECH_DIR_$+STR_TECH6_EXE_$ ), "", cmoOverwrite
  1322.     END IF
  1323.  
  1324.     IF DoesFileExist( MakePath( szPath$, TECH_DIR_$+STR_TECH7_EXE_$ ), femExists ) THEN
  1325.         CreateProgmanItem PROGMANGROUPNAME$, STR_TECH7_DESC_$, MakePath( szPath$, TECH_DIR_$+STR_TECH7_EXE_$ ), "", cmoOverwrite
  1326.     END IF
  1327.  
  1328.     IF DoesFileExist( MakePath( szPath$+FARREN_DIR_$, FARREN_SONG1_$ ), femExists ) THEN
  1329.         CreateProgmanItem PROGMANGROUPNAME$, FARREN_DESC1_$, MakePath(DEST$,PROGNAME$+" "+szPath$+FARREN_DIR_$+FARREN_SONG1_$ ), "", cmoOverwrite
  1330.     END IF
  1331.  
  1332.     IF DoesFileExist( MakePath( szPath$+FARREN_DIR_$, FARREN_SONG2_$ ), femExists ) THEN
  1333.         CreateProgmanItem PROGMANGROUPNAME$, FARREN_DESC2_$, MakePath(DEST$,PROGNAME$+" "+szPath$+FARREN_DIR_$+FARREN_SONG2_$ ), "", cmoOverwrite
  1334.     END IF
  1335.  
  1336.     IF DoesFileExist( MakePath( szPath$, FARREN_DIR_$+FARREN_PLAY3_$ ), femExists ) THEN
  1337.         CreateProgmanItem PROGMANGROUPNAME$, FARREN_DESC3_$, MakePath( szPath$, FARREN_DIR_$+FARREN_PLAY3_$ ), "", cmoOverwrite
  1338.     END IF
  1339.  
  1340.     IF DoesFileExist( MakePath( szPath$+FARREN_DIR_$, FARREN_SONG4_$ ), femExists ) THEN
  1341.         CreateProgmanItem PROGMANGROUPNAME$, FARREN_DESC4_$, MakePath(DEST$,PROGNAME$+" "+szPath$+FARREN_DIR_$+FARREN_SONG4_$ ), "", cmoOverwrite
  1342.     END IF
  1343.  
  1344.     IF DoesFileExist( MakePath( szPath$, FARREN_DIR_$+FARREN_PLAY5_$ ), femExists ) THEN
  1345.         CreateProgmanItem PROGMANGROUPNAME$, FARREN_DESC5_$, MakePath( szPath$, FARREN_DIR_$+FARREN_PLAY5_$ ), "", cmoOverwrite
  1346.     END IF
  1347.  
  1348.     IF DoesFileExist( MakePath( szPath$+DEMO_DIR_$, DEMO2_SONG_$ ), femExists ) THEN
  1349.         CreateProgmanItem PROGMANGROUPNAME$, DEMO2_DESC_$, MakePath(DEST$,PROGNAME$+" "+szPath$+DEMO_DIR_$+DEMO2_SONG_$ ), "", cmoOverwrite
  1350.     END IF
  1351.  
  1352.     RETURN
  1353.  
  1354. '**
  1355. '**    Purpose:
  1356. '**        Installs ICONS for SONG STATION
  1357. '**    Arguments:
  1358. '**        none.
  1359. '**    Returns:
  1360. '**        none.
  1361. '**    WARNING:
  1362. '**        The current method used here only works with Windows 3.1!
  1363. '*************************************************************************
  1364. INSTALL_SS_ICONS:
  1365.  
  1366. 'Determine drive letter.  Songs and Sounds are subdir off drive root.
  1367.  
  1368.     szPath$ = MID$( GetSymbolValue("STF_SRCDIR"), 1, 1 ) + ":\"
  1369.  
  1370.     IF DoesFileExist( MakePath( szPath$, TECH_DIR_$+STR_TECH1_EXE_$ ), femExists ) THEN
  1371.         CreateProgmanItem PROGMANGROUPNAME$, STR_TECH1_DESC_$, MakePath( szPath$, TECH_DIR_$+STR_TECH1_EXE_$ ), "", cmoOverwrite
  1372.     END IF
  1373.  
  1374.     IF DoesFileExist( MakePath( szPath$, TECH_DIR_$+STR_TECH2_EXE_$ ), femExists ) THEN
  1375.         CreateProgmanItem PROGMANGROUPNAME$, STR_TECH2_DESC_$, MakePath( szPath$, TECH_DIR_$+STR_TECH2_EXE_$ ), "", cmoOverwrite
  1376.     END IF
  1377.  
  1378.     IF DoesFileExist( MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY1_$ ), femExists ) THEN
  1379.         CreateProgmanItem PROGMANGROUPNAME$, SS_DESC1_$, MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY1_$ ), "", cmoOverwrite
  1380.     END IF
  1381.  
  1382.     IF DoesFileExist( MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY2_$ ), femExists ) THEN
  1383.         CreateProgmanItem PROGMANGROUPNAME$, SS_DESC2_$, MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY2_$ ), "", cmoOverwrite
  1384.     END IF
  1385.  
  1386.     IF DoesFileExist( MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY3_$ ), femExists ) THEN
  1387.         CreateProgmanItem PROGMANGROUPNAME$, SS_DESC3_$, MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY3_$ ), "", cmoOverwrite
  1388.     END IF
  1389.  
  1390.     IF DoesFileExist( MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY4_$ ), femExists ) THEN
  1391.         CreateProgmanItem PROGMANGROUPNAME$, SS_DESC4_$, MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY4_$ ), "", cmoOverwrite
  1392.     END IF
  1393.  
  1394.     IF DoesFileExist( MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY5_$ ), femExists ) THEN
  1395.         CreateProgmanItem PROGMANGROUPNAME$, SS_DESC5_$, MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY5_$ ), "", cmoOverwrite
  1396.     END IF
  1397.  
  1398.     IF DoesFileExist( MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY6_$ ), femExists ) THEN
  1399.         CreateProgmanItem PROGMANGROUPNAME$, SS_DESC6_$, MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY6_$ ), "", cmoOverwrite
  1400.     END IF
  1401.  
  1402.     IF DoesFileExist( MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY7_$ ), femExists ) THEN
  1403.         CreateProgmanItem PROGMANGROUPNAME$, SS_DESC7_$, MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY7_$ ), "", cmoOverwrite
  1404.     END IF
  1405.  
  1406.     IF DoesFileExist( MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY8_$ ), femExists ) THEN
  1407.         CreateProgmanItem PROGMANGROUPNAME$, SS_DESC8_$, MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY8_$ ), "", cmoOverwrite
  1408.     END IF
  1409.  
  1410.     IF DoesFileExist( MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY9_$ ), femExists ) THEN
  1411.         CreateProgmanItem PROGMANGROUPNAME$, SS_DESC9_$, MakePath( szPath$, SS_SONGS_DIR_$+SS_PLAY9_$ ), "", cmoOverwrite
  1412.     END IF
  1413.  
  1414.     IF DoesFileExist( MakePath( szPath$, SS_SOUNDS_DIR_$+SS_PLAY10_$ ), femExists ) THEN
  1415.         CreateProgmanItem PROGMANGROUPNAME$, SS_DESC10_$, MakePath( szPath$, SS_SOUNDS_DIR_$+SS_PLAY10_$ ), "", cmoOverwrite
  1416.     END IF
  1417.  
  1418.     IF DoesFileExist( MakePath( szPath$, SS_SOUNDS_DIR_$+SS_PLAY11_$ ), femExists ) THEN
  1419.         CreateProgmanItem PROGMANGROUPNAME$, SS_DESC11_$, MakePath( szPath$, SS_SOUNDS_DIR_$+SS_PLAY11_$ ), "", cmoOverwrite
  1420.     END IF
  1421.  
  1422.     IF DoesFileExist( MakePath( szPath$, SS_SOUNDS_DIR_$+SS_PLAY12_$ ), femExists ) THEN
  1423.         CreateProgmanItem PROGMANGROUPNAME$, SS_DESC12_$, MakePath( szPath$, SS_SOUNDS_DIR_$+SS_PLAY12_$ ), "", cmoOverwrite
  1424.     END IF
  1425.  
  1426.     IF DoesFileExist( MakePath( szPath$, SS_SOUNDS_DIR_$+SS_PLAY13_$ ), femExists ) THEN
  1427.         CreateProgmanItem PROGMANGROUPNAME$, SS_DESC13_$, MakePath( szPath$, SS_SOUNDS_DIR_$+SS_PLAY13_$ ), "", cmoOverwrite
  1428.     END IF
  1429.  
  1430.     IF DoesFileExist( MakePath( szPath$, SS_SOUNDS_DIR_$+SS_PLAY14_$ ), femExists ) THEN
  1431.         CreateProgmanItem PROGMANGROUPNAME$, SS_DESC14_$, MakePath( szPath$, SS_SOUNDS_DIR_$+SS_PLAY14_$ ), "", cmoOverwrite
  1432.     END IF
  1433.  
  1434.     IF DoesFileExist( MakePath( szPath$, FARREN_DIR_$+FARREN_PLAY5_$ ), femExists ) THEN
  1435.         CreateProgmanItem PROGMANGROUPNAME$, FARREN_DESC5_$, MakePath( szPath$, FARREN_DIR_$+FARREN_PLAY5_$ ), "", cmoOverwrite
  1436.     END IF
  1437.  
  1438.     RETURN
  1439.  
  1440.  
  1441.