windows - 避免让 MSI 进入兼容模式 "Previous version of Windows"

标签 windows windows-7 com windows-installer com-server

我有一个 32 位应用程序的安装程序包(使用 MakeMsi 构建,最初是为 Windows XP 而简单维护的),它无法在现代(64 位)Windows 系统上注册 COM 服务器(7、8 , 10).这是我在尝试正常安装 MSI 时看到的:

Screenshot of COM registration error

Application Error

Exception EOleSysError in module xyz at 000F0B01. Error accessing the OLE registry.

如果我将 MSI 置于兼容模式 以前版本的 Windows,COM 服务器会成功注册。由于“它正在工作”不知何故,到目前为止我没有投入太多时间来探索原因。但最后,我厌倦了一次又一次地记住我们的客户(有时也是我)这个先决条件,所以我想解决这个问题。

注册(和注销)是通过 CustomAction 完成的,正如我使用 Orca 所看到的那样:

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

对于每个条目,Type1122SourceINSTALLDIR.MYAPP

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

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

最佳答案

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

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

关于windows - 避免让 MSI 进入兼容模式 "Previous version of Windows",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38739380/

相关文章:

c++ - 程序崩溃 - 如何读取 appcompat.txt?

wpf - 我们是否需要安装 os 语言包来本地化 wpf 应用程序?

java - 重新启动 linux 和 windows 的 java 应用程序

c# - 注册表中的 RUNASADMIN 似乎在 Windows 7 中不起作用

android - LG Revolution 和 Android 开发

python - 使用 python/COM 的 Windows 应用程序自动化

c# - 使用 COM UPnP 库注册设备/服务

python - 在 Windows 上取消 python 中的停滞文件复制

visual-studio-2010 - 阅读隔行PNG时如何解决libpng警告?

c++ - D3D 和 COM 的问题