我有一个应用程序(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。两者都表现不同,因为他们没有在事件日志中添加任何内容。否则他们都会像原来的电话一样停留在“准备安装......”中......
我现在已经坚持了一段时间。有人能发现我做错了吗?