3

I have a .msi file created by a program called MSICREATE and doctored using orca as follows...

InstallExecuteSequence Table

* added FindRelatedProducts with sequence 410
* added RemoveExistingProducts with sequence 1450

InstallUISequence Table

* added FindRelatedProducts with sequence 200

PropertyTable

* added RemovePreviousVersions TRUE
* added SECURECUSTOMPROPERTIES SOLARUPGRADE
* had a existing UpgradeCode with guid created by MSICREATE
* had a existing ProductVersion 12.2.12.0 created my MSICREATE

Added a Upgrade Table

* UpgradeCode same value as Upgrade in Property Table
* VersionMin null
* VersionMax 99.12.31
* Attributes 1
* ActionProperty SOLARUPGRADE (same value as SECURECUSTOMPROPERTIES in Property Table)

I also assigned a new PackageCode and a new ProductCode so the new msi had different values of PackageCode, ProductCode, and ProductVersion than the previously installed product.

When I run this msi with the product previously installed, the old product is deleted, a new program files directory created and all the files except the .exe reinstalled from the new .msi. A repair will cause the .exe to be created. If the new msi is installed AFTER removing the old product (using control panel add/remove programs), all files including the .exe are installed.

The msiexec log file is mywebspace.wisc.edu/mdorl/msilog/log3.log

The .msi is mywebspace.wisc.edu/mdorl/msilog/sbl_Major_Upgrade.msi

The only things that looks weird to me are the following lines from the log. The first, second, and fourth are files that do get installed, the third is the .exe file that does not get installed. NOTE THE NULL ACTION ON THIS ENTRY.

Action start 8:04:41: InstallValidate.
MSI (s) (18:F4) [08:04:41:671]: Feature: _MainFeature; Installed: Absent;   Request: Local;   Action: Local
MSI (s) (18:F4) [08:04:41:671]: Component: _24A30964F6B6462282E161248AF15827; Installed: Absent;   Request: Local;   Action: Local
MSI (s) (18:F4) [08:04:41:671]: Component: _7B95B32E33EB4F699B44D53CA5BC22B5; Installed: Absent;   Request: Local;   Action: Local
MSI (s) (18:F4) [08:04:41:671]: Component: _2FBD153583AF40C09EB9920149F7C7B7; Installed: Absent;   Request: Local;   Action: Null
MSI (s) (18:F4) [08:04:41:671]: Component: _38A400D7DB76479CA0EC6D643D5793CD; Installed: Absent;   Request: Local;   Action: Local
4

4 回答 4

1

Windows 安装程序使用密钥文件及其 GUID 来检测组件,这里有更多详细信息:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa370561(v=vs.85) .aspx

正如您所怀疑的,Windows Installer 也在检查文件版本,我假设您在新版本中正确地增加了文件版本。以下是它遵循的规则:http: //msdn.microsoft.com/en-us/library/windows/desktop/aa368599 (v=vs.85).aspx

您需要将 EXE 文件表中的版本列设置为比机器上已经存在的版本更高的值,否则 Windows Installer 将决定保留旧版本更好,因为它具有更高的版本。

于 2012-02-14T15:59:25.680 回答
1

如果您查看第 603 行的日志,您会发现以下内容:

MSI (s) (18:10) [08:04:41:827]:不允许卸载组件:{ADC6C3E9-A0CF-4AFC-9998-7B9449C8EA10} 因为另一个客户端存在 MSI (s) (18:10) [08 :04:41:827]:不允许卸载组件:{F74907E7-607E-49D1-B613-D63A36ADB020},因为另一个客户端存在 MSI (s) (18:10) [08:04:41:827]:不允许卸载组件:{B1FE4023-E176-42BC-92C3-15B8E50CFBB0},因为另一个客户端存在 MSI (s) (18:10) [08:04:41:827]:不允许卸载组件:{E6F5DF5D-3460-4B44-8743- 48787E68A2C1} 因为另一个客户端存在

如果安装在同一台机器上的多个软件包共享相同的组件,就会发生这种情况。Windows Installer 保留组件的引用计数,并允许删除它们,直到删除所有使用它们的应用程序。

如果您在测试/开发机器上遇到这种情况,我建议您在干净的 VM 上进行测试,以确保之前的其他测试不会影响这个。

此外,如果您知道您在其他应用程序的包中使用了相同的组件,请编辑它们,确保每个组件对每个包都有一个唯一的 GUID。

于 2012-02-14T14:47:46.043 回答
1

为了结束这个项目,这是我发现的内容以及我为解决问题所做的工作。

1)我对版本化/非版本化文件的含义仍然很模糊。我猜所有的 .exe 文件都是版本化的。我想这意味着这些文件需要文件表中的相应版本。

2)我现在明白文件表版本需要与 ProductVersion 无关。

3) 我一直在使用非法 ProductVersion 例如。2012.02.16。我改用 12.2.16 之类的东西。

4) 我在 Visual Studio 中设置了 .exe VS_VERSION_INFO FILEVERSION 并将相同的值添加到文件表版本字段。

现在,当我进行重大升级时,所有文件都会被替换。

于 2012-02-16T16:53:12.277 回答
0

文件表 ALL 中的条目没有版本。为什么非 .exe 文件被区别对待并重新安装?

我想其他文件的版本增加了。Windows Installer 应该对包中的所有文件应用版本控制规则。

所以这意味着用户不可能使用重大升级 msi 安装旧版本的产品?

如果您想在新包中保持较小的版本,我看不到解决方案。当然,自定义操作除外。

什么是合法版本?在一个地方我看到 255.255.65535 而在另一个地方我看到 65535.65535.65535.65535

它们都是正确的版本号。后一个值通常设置为一个文件,以确保它替换机器中的任何其他现有文件,即操作系统允许的最高版本号。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa368596(v=vs.85).aspx

于 2012-02-15T07:24:50.293 回答