在 InstallShield 中,如何在 SQL 文本替换使用之前更改我的 属性 的值?

In InstallShield, how to change the value of my Property before it is used by SQL Text Replacement?

我想做什么

在 InstallShield 中,我想在 SQL 文本替换功能使用它之前设置 属性 的值。我希望新的 属性 值来自我添加到对话框的编辑控件。

到目前为止我做了什么

我已将 SQL 脚本添加到我的 InstallShield 项目,其中包括 InstallShield 文本替换功能的占位符。我使用“文本替换”选项卡查找 SQL 脚本中的占位符并将其替换为我已添加到 属性 管理器的 属性 的值。这可以正常工作,但仅适用于 属性 的默认值。

我卡在哪里

问题是我希望新值来自自定义对话框中的编辑控件,但我找不到执行此操作的方法。文本替换始终使用 属性 的默认值。

我试过的是以下 InstallScript,当用户在我的自定义对话框中单击“下一步”时它会运行:

CtrlGetText("MyDialog", EDIT_VALUE_FROM_USER, svValueFromUser);
MsiSetProperty ( hwndDlg, "EDIT_VALUE_FROM_USER", svValueFromUser);

其中 EDIT_VALUE_FROM_USER 是我的 属性。这运行没有错误,但该值没有传递到最终的 SQL 脚本。

为什么 EDIT_VALUE_FROM_USER 的新值没有被 SQL 文本替换使用?我如何诊断它为什么不起作用?我应该以完全不同的方式来做这件事吗?

我猜你的 属性 没有列在 SecureCustomPublicProperties 属性 中,并且在安装程序转换到安装执行序列时被设置回默认值。安装的日志文件将提供更多数据供使用。

原来是因为我没有使用系统 属性 ISMSI_HANDLE.

因此,从自定义对话框中的编辑控件编写 属性 的正确代码是:

CtrlGetText("MyDialog", EDIT_VALUE_FROM_USER, svValueFromUser);
MsiSetProperty (ISMSI_HANDLE, "EDIT_VALUE_FROM_USER", svValueFromUser);