我有一个32位应用程序的安装程序包(使用MakeMsi构建,最初用于Windows XP,从那时起简单维护),无法在现代(64位)Windows系统上注册COM服务器(7,8 ,10)。这是我在尝试正常安装MSI时看到的:
应用程序错误
000F0B01模块xyz中的异常EOleSysError。访问OLE注册表时出错。
如果我将MSI置于兼容模式以前版本的Windows ,则COM服务器会成功注册。由于"它的工作" 不知何故,到目前为止,我没有花太多时间探索原因。但最后,我已经筋疲力尽地一次又一次地记住我们的客户(有时也是我),所以我希望解决这个问题。
注册(和取消注册)是通过 CustomAction 完成的,我看到使用Orca进行调查:
"[INSTALLDIR.MYAPP]\placeholder.exe" -regserver
"[INSTALLDIR.MYAPP]\placeholder.exe" -unregserver
对于其中每个条目,Type
为1122
,Source
为INSTALLDIR.MYAPP
。
我可以想象COM服务器在安装过程中没有足够的权限启动,但是没有安装程序自动运行管理员权限?我的意思是,当我(作为标准用户)通过双击启动安装程序时,它会在实际安装之前显示UAC提示符。为什么COM服务器不能以提升的注册和注销权限运行?这令人困惑......
如何更改MSI以使Windows安装程序成功处理?
答案 0 :(得分:2)
我假设您知道问题在于您作为自定义操作运行的可执行文件,而不是Windows Installer中的任何操作。这意味着问题将是可执行文件中的代码,并且它可能很旧并且与以后的OS版本不兼容。您需要查看代码以查看其不受支持的操作。
许多安装都不需要自行注册。该数据是所有静态数据,可以提取一次并包含在注册表项和其他COM类表中的MSI文件中。这意味着在安装过程中根本不需要运行代码。
答案 1 :(得分:0)
在学习了如何register COM servers the right way后,我仍然有兴趣了解为什么我的MSI包之前有效。换句话说:Windows XP之后的关键变化是什么?
...我同时还检查了当我以管理员身份运行时MSI正常工作......
当我想到阅读WiX工具集文档时,Impersonate
有一个属性CustomAction
来控制CA是否以提升的权限执行:
它指的是msidbCustomActionTypeNoImpersonate
flag的Type
字段中的CustomAction
Table。我在MSI中观察到的值1122
被反编译为:
我过去常常"修复"快速方法的问题是,在CA类型中启用msidbCustomActionTypeNoImpersonate
标志(2048
)(在WiX中,这将是Impersonate="no"
)。
转换为我的 MakeMsi 脚本,我必须使用 {{3}的System
中的Type
属性以使自己的注册工作像以前一样:
Type="Deferred Sync AnyRc System"
我完全清楚这只是一种解决方法,因为为(un-)寄存器运行COM服务器很危险。因此,应优先考虑ExeCa
command第二部分中提到的解决方案:通过MSI中的注册表项管理与COM相关的静态信息。但有时您需要快速解决方案,有时还需要没有其他选择,请参阅PhilDWs answer。