0

我有一个带有 MSSQL 特权的项目。到目前为止,sql 是使用硬编码的实例名称安装的。现在我想在安装过程中创建用户自定义此名称的功能。

这就是我所做的:

我使用编辑控件创建了新的对话框窗口,以从用户那里获取 sql 实例的名称。当用户单击“下一步”按钮时,我将开始安装过程(从互联网下载 sql 安装并开始静默安装)。因为我想向用户提供一些反馈,所以我可能应该更新一些文本控件,例如“正在安装 SQL”。我试图找到如何从我的操作中更新 UI 的方法,但没有成功。

这是我的解决方案:

我已经使用空的 Text 属性放置了 Text 控件。在订阅选项卡(在此文本控件上)中,我选择了事件 ActionData 和属性文本。在我的操作中,我尝试发送这样的文本:

hRecActionData = MsiCreateRecord(1);
 if( hRecActionData = NULL )then
   MessageBox( "Failed to create record.", SEVERE);
 endif;

 nRes = MsiRecordSetString( hRecActionData, 1,"Instaling SQL..." );
 if( nRes != ERROR_SUCCESS )then
  MessageBox( "SetString failed", SEVERE );
 endif;

 nRes = MsiProcessMessage( hMSI, INSTALLMESSAGE_ACTIONDATA, hRecActionData );
 if( nRes != ERROR_SUCCESS )then
  MessageBox( "ProcessMessage failed", SEVERE );
 endif;

代码运行没有任何错误,但文本没有更新。

我的方法好还是应该在我的场景中使用其他方法?为什么我的代码不起作用?

4

1 回答 1

1

假设您的句柄是正确的,那么问题可能是默认的 UI 处理程序在您的对话框中找不到名为 ActionText 的控件 - 它需要一个控件来显示该数据,而这正是它使用的那个。对我来说,您的记录符合以下格式并不明显:

http://msdn.microsoft.com/en-us/library/aa371614(v=vs.85).aspx

如果您的代码调用来自 DoAction 事件,则某些较旧的操作系统版本不支持从控制事件中调用 MsiProcessMessage。

除此之外,在我看来,如果您不打算提供任何其他信息,您实际上并不需要任何代码。您可以在 Next 按钮上设置一个 ActionText 事件,该事件将该文本发送到对话框上的 ActionText 控件。

无论哪种方式,所有这些都涉及到 EventMapping 表,我不知道您如何告诉 InstallShield 处理订阅事件的控件,因为您需要对话框中的控件来响应 ActionText和数据消息。

于 2014-06-05T15:48:23.613 回答