MSChart的CreateControl触发Windows Installer无限准备安装问题求助
嘿,这种问题我之前帮别人排查过好几次,核心原因几乎都和CMSChart这个控件的COM组件状态或者依赖环境有关,下面给你拆解具体的触发原因:
1. CMSChart的COM注册出问题了
CMSChart本质是Office的旧版ActiveX控件(对应MSChart.ocx),当你调用CreateControl时,系统会尝试加载这个COM对象。如果它的注册表信息丢了、坏了,或者对应的ocx文件路径不对,Windows Installer就会误以为Office的组件没装完整,自动触发修复流程。但如果修复过程因为源文件缺失或者其他问题卡壳,就会陷入“正在准备安装”的无限循环。
常见的注册问题比如:
- 注册表中
HKEY_CLASSES_ROOT\CLSID\{MSChart的CLSID}下的信息缺失,或者指向的ocx文件不存在 MSChart.ocx本身损坏,或者从来没通过regsvr32命令正确注册过
2. 系统缺控件依赖的Office组件
CMSChart依赖Office的特定组件,如果你的Office是精简版、绿色版,或者安装时没勾选Chart Controls相关的选项,当控件试图加载依赖项时,Windows Installer就会触发安装/修复。但如果安装源(比如当初的Office安装镜像)已经找不到了,修复就会反复失败,导致弹窗循环。
3. 位数不匹配
要是你开发的DLL是64位的,但MSChart.ocx是32位的(旧版Office的这个控件大多只有32位),调用CreateControl时会加载失败,系统可能误判为组件未安装,触发安装流程。反过来,32位DLL在64位系统里运行,但控件在Wow6432Node下的注册表项缺失,也会出同样的问题。
4. 权限不够
如果调用DLL的程序是用受限权限运行的,访问控件的注册表项或者ocx文件时会被拒绝,系统可能误以为组件损坏,触发修复,但权限不足又导致修复完不成,最后就无限弹窗了。
- 重新注册MSChart.ocx:先找到系统里的
MSChart.ocx,64位系统一般在C:\Windows\SysWOW64,32位系统在C:\Windows\System32。然后以管理员身份开命令提示符,运行对应的注册命令:regsvr32.exe "C:\Windows\SysWOW64\MSChart.ocx" // 64位系统装32位控件 regsvr32.exe "C:\Windows\System32\MSChart.ocx" // 32位系统 - 修复Office安装:打开控制面板→程序和功能,找到你的Office,右键选「更改」→「快速修复」,要是不行就选「联机修复」,确保所有相关组件都装全了。
- 核对位数匹配:确认你的DLL和
MSChart.ocx的位数一致,32位DLL对应32位控件,64位的话得找对应的64位控件(不过旧版Office可能没有64位的MSChart)。 - 试下管理员权限:用管理员身份运行调用这个DLL的程序,看看弹窗会不会消失。
内容的提问来源于stack exchange,提问作者Matthew Mallimo

