wix安装程序工具集中的ComboBox上的自定义操作删除/添加

时间:2018-11-26 11:43:38

标签: database combobox wix windows-installer

我有一个对话框(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)

2 个答案:

答案 0 :(得分:0)

您是否考虑过使用属性在组合框中保留和共享值?

答案 1 :(得分:0)

添加和删除组合框项目的另一种方法是使用数据库概念。 您可以对编写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";