Windows Installer无法找到注册表项

时间:2015-07-09 21:17:47

标签: windows-installer installshield

我正在使用InstallShield 2014 Premier构建多实例安装程序并向注册表添加密钥(来自Registry表):

Registry   | Root | Key                                                    | Name | Value | Component           | ISAttributes
Registry34 | 2    | SOFTWARE\MyCompany\MyProduct\[InstanceId]\InstanceData | ENV  | [ENV] | ISRegistryComponent | 0

安装后来自注册表的密钥:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyCompany\MyProduct\0\InstanceData
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyCompany\MyProduct\1\InstanceData

两者都包含我期望的值。但是,当我搜索它们时,我似乎找不到它们(RegLocator表):

Signature     | Root | Key                                                    | Name | Type
NewSignature1 | 2    | SOFTWARE\MyCompany\MyProduct\[InstanceId]\InstanceData | ENV  | 18

Appsearch表有ENV | NewSignature1

我已尝试在设置64位搜索标志的情况下进行各种尝试(类型中2比18)。

从卸载后的安装日志中,您将看到未使用注册表中的值设置ENV属性(' PROD'是ENV属性的默认值):

Action start 16:58:38: INSTALL.
MSI (s) (5C:C8) [16:58:38:080]: Running ExecuteSequence
MSI (s) (5C:C8) [16:58:38:080]: Doing action: AppSearch
Action start 16:58:38: AppSearch.
MSI (s) (5C:C8) [16:58:38:080]: Note: 1: 2262 2: Signature 3: -2147287038 
MSI (s) (5C:C8) [16:58:38:081]: PROPERTY CHANGE: Adding IISROOTFOLDER property. Its value is 'C:\inetpub\wwwroot\'.
MSI (s) (5C:C8) [16:58:38:081]: Note: 1: 2262 2: Signature 3: -2147287038 
MSI (s) (5C:C8) [16:58:38:081]: PROPERTY CHANGE: Adding DOTNETVERSION40FULL property. Its value is '#1'.
MSI (s) (5C:C8) [16:58:38:081]: Note: 1: 2262 2: Signature 3: -2147287038 
MSI (s) (5C:C8) [16:58:38:081]: Note: 1: 1402 2: HKEY_LOCAL_MACHINE\SOFTWARE\MyCompany\MyProduct\1\InstanceData 3: 2 
MSI (s) (5C:C8) [16:58:38:081]: Note: 1: 2262 2: Signature 3: -2147287038 
MSI (s) (5C:C8) [16:58:38:081]: PROPERTY CHANGE: Adding IIS_VERSION property. Its value is '#8'.
MSI (s) (5C:C8) [16:58:38:082]: Doing action: UpdateProductName_setProp
Action ended 16:58:38: AppSearch. Return value 1.
MSI (s) (5C:C8) [16:58:38:082]: PROPERTY CHANGE: Modifying ProductName property. Its current value is 'MyCompany MyProduct Server Components'. Its new value: 'MyCompany MyProduct Server Components - PROD'.
Action start 16:58:38: UpdateProductName_setProp.

我做错了什么?

1 个答案:

答案 0 :(得分:1)

日志文件中的以下行包含您应该查看的信息:

MSI(5C:C8)[16:58:38:081]:注意:1:1402 2:HKEY_LOCAL_MACHINE \ SOFTWARE \ MyCompany \ MyProduct \ 1 \ InstanceData 3:2

以上一行解释如下: Windows安装程序错误代码1402,MSI SDK定义如下: 无法打开密钥:[2]。系统错误[3]。

系统错误代码2表示: ERROR_FILE_NOT_FOUND

日志文件清楚地表明找不到注册表项。我假设日志的片段是在RegLocator表中设置64位搜索标志的时候。 但是,您的注册表项是在32位配置单元(Wow6432Node)中创建的。

要解决此问题,您应该这样做:

- 将RegLocator表中Type类型下的值设置为2。 这将确保在32位配置单元中执行注册表搜索。

- 将属性ENV添加到SecureCustomProperties列表中。

可能这里发生的是,ENV属性的值不会传递给Execute序列。对于要传递给执行序列的属性的值,您需要保护属性,即。将ENV属性添加到Property表中的SecureCustomProperties。

执行此操作后,代码段应该开始工作。

通常,在正常情况下,公共属性的值从UI序列传递到执行序列。但是,可能存在锁定条件,其中属性需要显式添加到Property表中的SecureCustomProperties列表中,以便传播到Execute序列。

希望这有帮助。

此致

Kiran Hegde