0

我们最近从滚动我们自己的安装移回 InstallShield 2008。所以,我仍在努力提高学习曲线。

我们正在使用 Firebird 和一个 USB 驱动程序,我们找不到好的 msi 安装解决方案。因此,我们有一个 cmd 行来静默安装 firebird,而 USB 驱动程序大多静默安装。

我们已将此代码放入事件处理程序 DefaultFeatureInstalled。这在第一次安装时效果很好。但是,当我进行卸载时,它会尝试再次启动 firebird 安装程序,因此它必须再次发送 DefaultFeatureInstalled 事件。

他们是要使用另一个事件,还是有办法在 DefaultFeatureInstalled 事件中检测它是安装还是卸载?

4

5 回答 5

1

克里斯,我根本无法让 MsiGetProperty 工作。只需添加您拥有的代码

string sRemove;
number nBuffer;

nBuffer = 256;
if (MsiGetProperty(ISMSI_HANDLE, "REMOVE", sRemove, nBuffer) = ERROR_SUCCESS) then
     //do something
endif;

我得到“未定义的标识符”。我尝试了几件事来让 IS 识别它,但没有成功。经过一番摸索,我意识到 IS 一开始并没有在卸载时调用该函数。我有另一个函数, onEnd 我认为那是调用相同的东西。清理完之后,我得到了我一开始所期望的结果。

因此,正确的答案是您不必为 DefaultFeature_Installed 事件中的代码在卸载时不被调用做任何事情。

于 2008-09-30T15:43:18.650 回答
0

如果您使用的是 InstallScript 或 InstallScript MSI 项目,您将需要处理 OnFirstUIBefore 事件。第一次运行安装程序时调用它。当安装程序再次启动时,将在其位置引发 OnMaintUIBefore 事件。

于 2008-10-09T12:52:09.653 回答
0

我正在做一个 InstallScript 项目。

我仔细检查了该事件,我使用的函数是带下划线的 DefaultFeature_Installed。我搜索了网络和 IS 的网站,发现提到它但没有定义。我在这里询问了最初将代码移至此事件的开发人员,她不记得将代码移至此事件的位置或原因。

今天早上我将研究 MsiGetProperty。感谢您的指点。

于 2008-09-25T14:58:14.113 回答
0

您可以查看一些 MSI 属性,这些属性会告诉您产品是否已安装或是否正在卸载。如果产品已经存在,Installed 属性将为真,因此您可以在布尔表达式中使用它(例如:未安装)。如果正在进行卸载,则 REMOVE 属性将设置为“ALL”。您可能可以根据这些属性调整 Firebird 安装逻辑,您可以使用MsiGetProperty函数检索这些属性。

注意:属性名称的含义因大小写而异,因此请确保使用上述大小写。

我在 IS 在线帮助或 Google 中找不到对 DefaultFeatureInstalled 事件的任何引用。您的 InstallShield 项目是 Basic MSI 还是 InstallScript?

于 2008-09-25T00:20:30.323 回答
0

您可以将此代码添加到 DefaultFeature_Installed 事件:

string sRemove;
number nBuffer;

nBuffer = 256;
if (MsiGetProperty(ISMSI_HANDLE, "REMOVE", sRemove, nBuffer) = ERROR_SUCCESS) then
     //do something
endif;

注意:函数名区分大小写。ISMSI_HANDLE 值是InstallShield 安装引擎的句柄。如果 sRemove 等于“ALL”,表示正在卸载,您可以跳过 Firebird 安装。

于 2008-09-28T00:40:20.193 回答