MSI错误 - regsvr32自定义操作失败

Hzm*_*zmy 8 windows delphi installer windows-installer regsvr32

简要

我有一个安装包(基于MSI),它试图注册一个dll文件,用作Windows资源管理器栏(Internet Explorer工具栏).

自定义操作定义如下:

[SystemFolder]\regsvr32.exe /s "pathtodllhere"
Run Code Online (Sandbox Code Playgroud)

错误

  • 该REGSVR32自定义操作并不能在Windows XP 64位工作.

MSI日志输出:

CustomAction SystemFolder_2返回实际的错误代码5.错误1722.此Windows Installer程序包有问题.作为设置的一部分运行的程序没有按预期完成.操作SystemFolder_2,位置:C:\ Windows\SysWOW64 \,命令:regsvr32.exe/s"C:\ Program Files(x86)\ Test Install\test.dll"

MSI(s)(10:F4):产品:测试安装 - 错误1722.此Windows Installer程序包存在问题.作为设置的一部分运行的程序没有按预期完成.操作SystemFolder_2,位置:C:\ Windows\SysWOW64 \,命令:regsvr32.exe/s"C:\ Program Files(x86)\ Test Install\test.dll"

到目前为止,我的测试/想法的简要说明:

  • 自定义操作位于"InstallFinalize"部分,因此仅在文件被放入硬盘驱动器时运行.
  • DLL文件没有损坏且有效.
  • Regsvr32自定义操作正常(和MSI安装):Windows 7 32位和Windows XP 32位.
  • Regsvr32 32位版本在64位安装期间执行(应该如此).
  • Regsvr32失败,错误代码为5,即ERROR_ACCESS_DENIED.

解决方案和冥想

  1. 自行注册 - 不使用regsvr32并使用我的MSI安装程序手动放置注册表项.
  2. dll是一个Delphi COM dll,它使用TRegistry组件进行自我注册.再一次,我想不出为什么这不起作用的原因,因为它只是一个包装,而只是一个想法.

希望我在这里展示我的研究,不要浪费任何人的时间!

Mic*_*ips 3

最佳实践解决方案(正如您所提到的)是从组件中提取注册表项并使用 msi 将它们写入注册表。

背景

Regsvr32 需要管理员权限和提升的权限确认才能在 64 位 Windows 7 下注册 COM 组件,但 msiexec 不知道为自定义操作请求提升的权限。

您可以通过使用“打开方式...”在组件上运行 C:\Windows\SysWOW64\regsvr32.exe 来测试此要求(这将失败)。而如果您创建用于注册的批处理文件,然后“以管理员身份运行”,则组件将成功注册。