首页 > 解决方案 > wix 安装程序工具集中的 ComboBox 上的自定义操作删除/添加

问题描述

我有一个对话框(D1),它有一个 ComboBox,其中 ComboBox 的项目由自定义操作(C++ dll)填充。

UINT __stdcall FillComboBox(MSIHANDLE hInstall) 
{ 
  HRESULT hResult = WcaInitialize(hInstall, "FillComboBox");

  if (FAILED(hResult)) return ERROR_INSTALL_FAILURE;

  MSIHANDLE hTable = NULL;
  MSIHANDLE hColumns = NULL;


  hResult = WcaAddTempRecord(&hTable, &hColumns, L"ComboBox", NULL, 0, 3, L"COMBOBOXVALUES", 1, L"ABC");
  hResult = WcaAddTempRecord(&hTable, &hColumns, L"ComboBox", NULL, 0, 3, L"COMBOBOXVALUES", 2, L"DEF");
  hResult = WcaAddTempRecord(&hTable, &hColumns, L"ComboBox", NULL, 0, 3, L"COMBOBOXVALUES", 3, L"GHI");
}

当用户选择了一个项目时,下一个按钮被启用,并显示另一个对话框 (D2)(如果用户单击下一个按钮)和另一个组合框。D2 组合框也由自定义操作以与第一个相同的方式填充,但项目的选择基于在第一个对话框 (D1) 中选择的项目。

我的问题是,如果用户单击对话框 D2 中的后退按钮,并且在 D1 对话框中更改了组合框的选择,然后单击下一个按钮(要移回 D2),我想“重新加载”D2-ComboBox 中的项目使用在 D1 中选择的新值。

有没有办法从 c++ 代码中清除 msi 表?

我可以使用函数删除组合框表吗

MsiDatabaseOpenView(hDatabase, L"DELETE FROM 'ComboBox' WHERE 'Property' = 'COMBOBOXVALUES'", &hView)

标签: databasecomboboxwixwindows-installer

解决方案


添加和删​​除组合框项的另一种方法是使用 DB 概念。您可以对 Table 编写 SQL 类型的查询进行直接操作。

HRESULT hResult = WcaInitialize(hInstall, "FillComboBox");
if (FAILED(hResult)) return ERROR_INSTALL_FAILURE;
MSIHANDLE hView = 0;
MSIHANDLE hDatabase = 0;
LPWSTR query;
query = L"INSERT INTO ComboBox (Property, `Order`, `Value`, `Text`) VALUES ('COMBOBOXVALUES', 1, 'Test', 'Test') TEMPORARY";
hDatabase = MsiGetActiveDatabase(hInstall);
hResult = MsiDatabaseOpenView(hDatabase, query, &hView);
if (hResult == ERROR_SUCCESS)
{
    hResult = MsiViewExecute(hView, 0);
}

要删除表,您可以使用以下查询。

query = L"DELETE FROM ComboBox";

为了删除特定行,您需要执行以下查询。

query = L"DELETE FROM ComboBox WHERE `Order` = 1";

推荐阅读