2016-08-03 37 views
0

我有一个用于32位应用程序(使用MakeMsi构建,最初用于Windows XP,并自此之后进行简单维护)的安装程序包,无法注册COM服务器在现代(64位)Windows系统上(7,8,10)。这是我看到想正常安装MSI我时:避免将MSI带入兼容模式“以前的Windows版本”

Screenshot of COM registration error

应用程序错误

异常EOleSysError模块XYZ在000F0B01。访问OLE注册表时出错。

如果我把MSI在兼容模式以前的Windows的版本中,COM服务器注册成功。由于“它正在工作”不知何故,我没有花费太多时间探索迄今的原因。但最后,我已经精疲力竭地记住我们的客户(有时候也是我)在这个先决条件中的一次又一次,所以我想解决这个问题。

登记(并且注销)经由CustomAction S DONE,在我寻找到它使用奥卡:

"[INSTALLDIR.MYAPP]\placeholder.exe" -regserver 
"[INSTALLDIR.MYAPP]\placeholder.exe" -unregserver 

对于每个那些条目,Type1122SourceINSTALLDIR.MYAPP

我可以想象,COM服务器在安装过程中启动时权限不足,但不是安装程序自动运行的管理员权限?我的意思是,当我(作为标准用户)通过双击启动安装程序时,它会在之前显示UAC提示进行实际安装。为什么COM服务器不能以提升的注册和注销权利运行?它令人困惑...

我应该如何更改我的MSI以使Windows安装程序成功处理它?

回答

0

在学习了如何register COM servers the right way后,我仍然有兴趣了解为什么我的MSI包之前工作。换句话说:Windows XP之后的关键变化是什么?
...我同时也检查了MSI的工作原理,当我以管理员身份运行它时...

正如我想出读取维克斯工具集的文档,存在一种用于CustomAction属性Impersonate如果CA与升高的权限执行控制:

This attribute specifies whether the Windows Installer, which executes as LocalSystem, should impersonate the user context of the installing user when executing this custom action. Typically the value should be 'yes', except when the custom action needs elevated privileges to apply changes to the machine.

它指的是CustomAction TableType字段中的msidbCustomActionTypeNoImpersonateflag。我在我的MSI观察值1122反编译成这样:

我曾经用快速方法“修复”问题,启用了CA类型中的msidbCustomActionTypeNoImpersonate标志(2048)(在WiX中这将是Impersonate="no")。

翻译成我的MAKEMSI脚本,我不得不使用System属性在TypeExeCa command才能使自注册工作前:

Type="Deferred Sync AnyRc System" 

我完全意识到这只是一种解决方法,因为为(注销)注册运行COM服务器是危险的。因此,PhilDWs answer第二部分中提到的解决方案应该是首选:通过MSI中的注册表项管理与COM相关的静态信息。但有时您需要快速解决方案,有时没有其他选项,请参阅Euro Micellis comment

2

我假设您知道问题出在您作为自定义操作运行的可执行文件中,而不是Windows Installer中的任何内容。这意味着问题将是可执行文件中的代码,并且可能是旧的,并且与以后的操作系统版本不兼容。您需要查看代码才能看到不支持的功能。

许多安装不会打扰自注册。这些数据都是静态数据,可以提取一次并包含在注册表项和其他COM类表的MSI文件中。这意味着在安装过程中不需要运行代码。

+1

事实上,自我注册在MSI软件包中非常不受欢迎,原因如下(请阅读https://msdn.microsoft.com/en-us/library/windows/desktop/aa371608.aspx)。我只在没有其他选择时才使用它(几个极其古老的第三方OCX控件,它们极力阻止我确定他们在注册表中写入的密钥) –

+0

写完问题后,我偶然发现这篇文章正是这样说的:[*'使用自注册是非常强烈的不鼓励微软,应该不惜一切代价避免。* *(https://www.firegiant.com/wix/tutorial/com-expression-syntax- miscellanea/components-of-a-different-color /)现在我确定这是我的问题。你有没有想过如何获得不属于VS解决方案的COM服务器(exe)的注册表项?我的意思是,除了在体外自我注册之前和之后对注册表进行区分? – Wolf

+0

关于*问题出现在可执行文件中*:我认为这个可执行文件最有可能是正确的,但是权限并不适合。如果我开始自我注册的exe文件,我必须使用管理员权限来执行此操作。 (当然,我认为自行注册并不是安装时的正确选择。) – Wolf