在Installshield中,最好的事件是仅在安装时而不是在卸载或者修复时启动应用程序?

时间:2020-03-06 14:41:43  来源:igfitidea点击:

我们最近从滚动自己的安装回到了InstallShield 2008. 因此,我仍在努力提高学习进度。

我们正在使用Firebird和USB驱动程序,但找不到合适的msi安装解决方案。因此,我们有一条cmd线路可以静默安装firebird,而USB驱动程序则可以静默安装。

我们已将此代码放入事件处理程序DefaultFeatureInstalled中。这在第一次安装时确实非常有效。但是,当我执行卸载操作时,它将尝试再次启动firebird安装程序,因此它必须再次发送DefaultFeatureInstalled事件。

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

解决方案

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

注意:属性名称根据大小写的含义不同,因此请确保使用上面的大小写。

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

我正在做一个InstallScript项目。

我仔细检查了该事件,并使用了带下划线的DefaultFeature_Installed函数。我已经搜索了Internet和IS的网站,却发现其中有提及,但没有定义。我问这里的开发人员,谁最初将代码移至该事件,而她不记得自己将代码移至该事件的位置或者原因。

今天早上我将研究MsiGetProperty。感谢指导。

我们可以将此代码添加到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安装。

克里斯,我根本无法使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事件中的代码做任何事情。

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