title: Optional components and types in inno-setup script
body: <p>I have created the following InnoSetup script for adding in optional components following advice from this StackOverflow answer: <a href="https://stackoverflow.com/questions/8890828/inno-setup-correct-use-of-types-components-and-tasks">Inno Setup - Correct use of [Types], [Components] and [Tasks]</a> .</p>
  
  <p>The problem is when I run the script and choose to install or Sherlock or Toby types I see that Watson is also installed.</p>
  
  <pre><code>; Script generated by the Inno Setup Script Wizard.
  ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
  
  #define MyAppName "Watson"
  #define MyAppVersion "1.0"
  #define MyAppExeName "Watson.exe"
  
  [Setup]
  ; NOTE: The value of AppId uniquely identifies this application.
  ; Do not use the same AppId value in installers for other applications.
  ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
  AppId={{15C6F30B-A29D-48AD-A97A-9FDB4DD80EAE}
  AppName={#MyAppName}
  AppVersion={#MyAppVersion}
  ;AppVerName={#MyAppName} {#MyAppVersion}
  AppPublisher={#MyAppPublisher}
  AppPublisherURL={#MyAppURL}
  AppSupportURL={#MyAppURL}
  AppUpdatesURL={#MyAppURL}
  DefaultDirName={pf}\{#MyAppName}
  DefaultGroupName={#MyAppName}
  OutputDir=Z:\EGPL Librarian Releases\Setup Scripts\All Install
  OutputBaseFilename=LibrarianSetup
  Compression=lzma
  SolidCompression=yes
  WizardImageFile=compiler:WizModernImage-IS.bmp
  WizardSmallImageFile=compiler:WizModernSmallImage-IS.bmp
  VersionInfoVersion=1.0
  VersionInfoCompany=Draper Laboratory
  VersionInfoDescription=Watson Librarian Server
  VersionInfoTextVersion=Watson 1.0
  VersionInfoCopyright=2012
  VersionInfoProductName=EGPL Librarian
  VersionInfoProductVersion=1.0
  VersionInfoProductTextVersion=Watson 1.0
  
  [Languages]
  Name: "english"; MessagesFile: "compiler:Default.isl"
  
  [Tasks]
  Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; Components: Watson Full
  
  [Files]
  Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Watson.exe"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
  Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Devart.Data.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
  Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Devart.Data.Linq.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
  Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Devart.Data.PostgreSql.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
  Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Devart.Data.PostgreSql.Linq.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
  Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Devart.Data.PostgreSql.xml"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
  Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Devart.Data.xml"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
  Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Ionic.Zip.dll"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
  Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Watson.application"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
  Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Watson.exe.config"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
  Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Watson.exe.manifest"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
  Source: "Z:\EGPL Librarian Releases\Sample Installation\Watson\Watson.pdb"; DestDir: "{app}"; Flags: ignoreversion; Components: Watson Full
  ; Toby
  Source: "Z:\EGPL Librarian Releases\Sample Installation\wwwroot\Toby\*"; DestDir: "c:\\wwwroot\Toby"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: Toby Full
  ; Sherlock
  Source: "Z:\EGPL Librarian Releases\Sample Installation\wwwroot\Sherlock\*"; DestDir: "c:\\wwwroot\Sherlock"; Flags: ignoreversion createallsubdirs recursesubdirs; Components: Sherlock Full
  ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
  
  [Icons]
  Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Components: Full Watson
  Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Components: Full Watson
  Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Components: Full Watson; Tasks: desktopicon
  
  [Run]
  Filename: "{app}\{#MyAppExeName}"; Flags: nowait postinstall skipifsilent; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&amp;', '&amp;&amp;')}}"; Components: Watson Full
  
  [Types]
  Name: "Everything"; Description: "Install Watson, Sherlock, and Toby"
  Name: "Watson"; Description: "Install Only Watson"
  Name: "Toby"; Description: "Install Only Toby"
  Name: "Sherlock"; Description: "Install Only Sherlock"
  
  [Components]
  Name: "Full"; Description: "Full Install"; Types: Watson Everything Toby Sherlock
  Name: "Watson"; Description: "Watson Component"; Types: Watson
  Name: "Toby"; Description: "Toby Component"; Types: Toby
  Name: "Sherlock"; Description: "Sherlock Component"; Types: Sherlock
  
  [Code]
  function IsDotNetDetected(version: string; service: cardinal): boolean;
  // Indicates whether the specified version and service pack of the .NET Framework is installed.
  //
  // version -- Specify one of these strings for the required .NET Framework version:
  //    'v1.1.4322'     .NET Framework 1.1
  //    'v2.0.50727'    .NET Framework 2.0
  //    'v3.0'          .NET Framework 3.0
  //    'v3.5'          .NET Framework 3.5
  //    'v4\Client'     .NET Framework 4.0 Client Profile
  //    'v4\Full'       .NET Framework 4.0 Full Installation
  //    'v4.5'          .NET Framework 4.5
  //
  // service -- Specify any non-negative integer for the required service pack level:
  //    0               No service packs required
  //    1, 2, etc.      Service pack 1, 2, etc. required
  var
      key: string;
      install, release, serviceCount: cardinal;
      check45, success: boolean;
  begin
      // .NET 4.5 installs as update to .NET 4.0 Full
      if version = 'v4.5' then begin
          version := 'v4\Full';
          check45 := true;
      end else
          check45 := false;
  
      // installation key group for all .NET versions
      key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + version;
  
      // .NET 3.0 uses value InstallSuccess in subkey Setup
      if Pos('v3.0', version) = 1 then begin
          success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);
      end else begin
          success := RegQueryDWordValue(HKLM, key, 'Install', install);
      end;
  
      // .NET 4.0/4.5 uses value Servicing instead of SP
      if Pos('v4', version) = 1 then begin
          success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);
      end else begin
          success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);
      end;
  
      // .NET 4.5 uses additional value Release
      if check45 then begin
          success := success and RegQueryDWordValue(HKLM, key, 'Release', release);
          success := success and (release &gt;= 378389);
      end;
  
      result := success and (install = 1) and (serviceCount &gt;= service);
  end;
  
  
  function InitializeSetup(): Boolean;
  begin
      if not IsDotNetDetected('v4\Full', 0) then begin
          MsgBox('Watson requires Microsoft .NET Framework 4.0 Full Profile.'#13#13
              'Please run dotNetFx40_Full_x86_x64.exe from the install disk,' #13
              'or download from www.microsoft.com/net,'#13
              'and then re-run the WatsonSetup.exe program.', mbInformation, MB_OK);
          result := false;
      end else begin
  //        MsgBox('Found Microsoft .NET Framework 4.0.', mbInformation, MB_OK);
          result := true;
      end;
  end;
  </code></pre>