Windows安装程序使用ProvideComponent进行自我修复

时间:2014-01-11 10:31:44

标签: delphi windows-installer

我有一个应用程序(app1)使用另一个应用程序(app2)的DLL来做一些事情。问题是我需要为DLL设置一些当前用户注册表才能工作。如果我从广告的快捷方式调用app2,它将调用Windows安装程序自我修复并填充其注册表。但是,如果我刚刚从另一个用户安装app2,第一次登录并使用了app1,它将失败,因为DLL不会填充它的注册表。

考虑到这一点,我尝试使用Self-Invoked Resiliency方法来触发MSI自我修复。

“HKCU”功能是包含单个组件“HCKURegistry”的顶级功能,该组件仅包含注册表项。 “HCKURegistry”组件的关键路径是HKCU蜂巢的关键。

我正在使用Delphi XE3,这是代码行:

szProductCode :='{293A0959-6ECF-4026-929B-ECC777934525}';
szComponent:=   '{45282475-634F-4222-81BA-030FA63703BD}' ;  
MsiProvideComponent(pwidechar(szProductCode),pwidechar('HKCU'),pwidechar(szComponent),INSTALLMODE_DEFAULT,  lpPathBuf,@pcchPathBuf);

然而,当我的app1执行此行时,Windows Installer会显示一个Windows安装程序“准备安装...”窗口并永远保持这样。如果我单击“取消”,它会显示“正在取消...”并保持这样状态,直到我从任务管理器中删除该应用程序。

事件日志显示两个项目:

Detection of product '{293A0959-6ECF-4026-929B-ECC777934525}', feature 'HKCU', component '{45282475-634F-4222-81BA-030FA63703BD}' failed.  
Detection of product '{293A0959-6ECF-4026-929B-ECC777934525}', feature 'HKCU' failed during request for component '{45282475-634F-4222-81BA-030FA63703BD}'

可能相关的信息。当我以正常方式触发自我修复时,我得到相同的两行,但第二行有额外的句子(组件的keypath注册表项):

Detection of product '{293A0959-6ECF-4026-929B-ECC777934525}', feature 'HKCU', component '{45282475-634F-4222-81BA-030FA63703BD}' failed.  The resource 'HKEY_CURRENT_USER\Software\MyData\SomePath' does not exist.

我尝试使用的绝望时刻:

res:=MsiReinstallFeature(pwidechar(szProductCode),pwidechar('HKCU'),REINSTALLMODE_USERDATA);

在MsiProvideComponent调用中交换INSTALLMODE_DEFAULT以获取REINSTALLMODE_USERDATA。两者都表现不同,因为他们没有在事件日志中添加任何内容。否则他们都会像原来的电话一样停留在“准备安装......”中......

我现在已经坚持了一段时间。有人能发现我做错了吗?

0 个答案:

没有答案