Como faço para preencher uma caixa de combinação no momento da instalação no WiX?

Edit: Eu atualizei o código abaixo para que agora funcione, graças à resposta de Rob.

Eu encontrei algumas páginas que mostram como fazer isso (http://www.cmcrossroads.com/content/view/13160/120/, http://www.mail-archive.com/[email protected]/msg05103.html) e examinou o código-fonte do WAI (http://wai.codeplex.com/), mas não consigo fazê-lo funcionar no meu instalador, não importa o que eu tente. Se alguém puder identificar o que estou fazendo de errado, ficarei muito grato. Meu fragmento WiX para o diálogo é assim:

<UI>
  <Dialog>

...snip...

    <Control Id="WebsiteName" Type="ComboBox" ComboList="yes" Sorted="yes" Property="IIS_WEBSITENAME" X="20" Y="73" Width="150" Height="17"/>

...snip...

    <!-- We want our custom action to fill in the WebsiteName ComboBox above
         however, if no ComboBox entries exist at compile time then the
         ComboBox table is not created in the MSI and we can't add to it in
         the custom action. So we have this hidden dummy list box to force
         the table to appear. -->
    <Control Id="DummyComboBox" Hidden="yes" Type="ComboBox" Sorted="yes" ComboList="yes" Property="DUMMYPROPERTY" X="65" Y="60" Width="150" Height="18">
      <ComboBox Property="DUMMYPROPERTY">
        <ListItem Text="Dummy" Value="Dummy"/>
      </ComboBox>
    </Control>
  </Dialog>
</UI>

<Property Id="DUMMYPROPERTY">Dummy</Property>
<Property Id="IIS_WEBSITENAME"/>
<CustomAction Id="FillWebsiteNameList" BinaryKey="WiXCustomAction.dll" DllEntry="FillWebsiteNameList" Execute="immediate" />
<InstallUISequence>
  <Custom Action="FillWebsiteNameList" After="CostFinalize"/>
</InstallUISequence>

Meu código de ação personalizado é:

[CustomAction]
public static ActionResult FillWebsiteNameList(Session xiSession)
{
  xiSession.Log("Begin FillWebsiteNameList");

  xiSession.Log("Opening view");

  View lView = xiSession.Database.OpenView("SELECT * FROM ComboBox");
  lView.Execute();

  xiSession.Log("Creating directory entry");

  DirectoryEntry lIis = new DirectoryEntry("IIS://localhost/w3svc");

  xiSession.Log("Checking each child entry");

  int lIndex = 1;
  foreach (DirectoryEntry lEntry in lIis.Children)
  {
    if (lEntry.SchemaClassName == "IIsWebServer")
    {
      xiSession.Log("Found web server entry: " + lEntry.Name);

      string lWebsiteName = (string)lEntry.Properties["ServerComment"].Value;
      xiSession.Log("Website name: " + lWebsiteName);

      xiSession.Log("Creating record");
      Record lRecord = xiSession.Database.CreateRecord(4);

      xiSession.Log("Setting record details");
      lRecord.SetString(1, "IIS_WEBSITENAME");
      lRecord.SetInteger(2, lIndex);
      lRecord.SetString(3, lEntry.Name); // Use lWebsiteName only if you want to look up the site by name.
      lRecord.SetString(4, lWebsiteName);

      xiSession.Log("Adding record");
      lView.Modify(ViewModifyMode.InsertTemporary, lRecord);

      ++lIndex;
    }
  }

  xiSession.Log("Closing view");

  lView.Close();

  xiSession.Log("Return success");

  return ActionResult.Success;
}

Costumava haver dois problemas:

1) O código acima falhou durante a execução da ação personalizada com "Função falhou durante a execução. Banco de dados: Tabela (s) Atualização falhou." - Isso ocorreu devido ao problema de indexação que fazia com que o código tentasse gravar uma cadeia em uma coluna int.

2) Se eu mudar a linha

lRecord.SetString(2, lWebsiteName);

para

lRecord.SetString(2, lEntry.Name);

em seguida, olhando para rastrear a ação parece ter sucesso, mas quando o instalador executar o combobox não tem entradas para escolher.

Se eu alterar a caixa de combinação para ter valores codificados, tudo funciona bem, mesmo se eu codificar o equivalente a lWebsiteName.

questionAnswers(2)

yourAnswerToTheQuestion