更新KB 2687323后,VB6 IDE无法加载MSCOMCTL.OCX

Rum*_*umi 44 vb6

Windows更新安装安全更新KB2687323后,我的VB6项目无法加载.显示的错误消息是"'[project_vbp_path] /MSCOMCTL.OCX'无法加载 - 继续加载项目?".请注意,messeage中的路径是vbp文件夹路径而不是控件的注册路径.

细节:

  1. MSCOMCTL.OCX在通常的system32文件夹中注册.
  2. 完全相同的项目生成的可执行文件,在更新前一小时运行正常并加载更新的MSCOMCTL.OCX(我已使用Process Explorer检查过它).

安全更新说明指出MSCOMCTL.OCX具有新的固定版本.所以我检查了"升级ActiveX控件"复选框的项目属性.我试过两种方式; 检查和取消选中无济于事.VB6 IDE拒绝加载升级后的OCX.

Rum*_*umi 54

经过几个小时的努力,系统恢复,注册,取消注册周期和睡眠,我已经设法找出问题所在.事实证明,项目文件包含以下行:

Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0; MSCOMCTL.OCX
Run Code Online (Sandbox Code Playgroud)

版本信息"2.0"似乎是没有加载的原因.在记事本中将其更改为"2.1"解决了问题:

Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.1#0; MSCOMCTL.OCX
Run Code Online (Sandbox Code Playgroud)

所以在类似的"OCX无法加载"的情况下,一种可能的解决方法是启动一个新项目.将控件放在其中一个表单上,并使用记事本检查vbp文件以查看它所期望的版本.


或者更简单的方法:

(我在Bob的宝贵评论下面添加了这一部分)

您可以在记事本中打开VBP项目文件,找到阻止VB6自动将项目升级到2.1并删除它的讨厌行:

NoControlUpgrade=1
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢我在 Windows 7 上它是 2.1,我只是将其更改为 2.0 (2认同)
  • 这是正确的答案。我不得不在 Win 10 上降级到 2.0。 (2认同)

Aut*_*uto 41

通过在提升的命令提示符中运行以下命令已解决此问题:

命令:

cd C:\Windows\System32\
regtlib msdatsrc.tlb
Run Code Online (Sandbox Code Playgroud)

要么

cd C:\Windows\SysWOW64\
regtlib msdatsrc.tlb
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.

  • 哇也为我工作.我有Win7但没有**regtlib.exe**.但是这样做了'%SystemRoot%\ Microsoft.NET\Framework\v4.0.30319\regtlibv12.exe msdatsrc.tlb`没有更多**VB6中没有注册的对象库:D.什么MSDATASRC =>用于ActiveX数据绑定的Microsoft数据源接口与MSCOMCTL有什么关系?好吧,也许是因为MSCOMCT2的'DTPicker'(访问某些数据库/记录集)以某种方式链接到MSCOMCTL. (3认同)

Eli*_*ias 12

问题:

Microsoft Office 2010产品(或更高版本)安装会破坏MSCOMCTL.ocx和COMCTL32.ocx兼容性的更新.不幸的是,这会影响许多其他程序,如Visual Basic 6 SP6甚至Oracle Virtual Box v5.实际问题是HKEY_CLASSES_ROOT\TypeLib\{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}\2.0注册表项.您可以在此处找到有关此问题的详细背景信息.

这是另一个有效的解决方案

该解决方案假定您没有通过删除,替换和重新注册MSCOMCTL.ocx和COMCTL32.ocx而未注销Office修补程序文件来损坏您的注册表.

创建一个名为fix.cmd的批处理文件,并在其中放置以下命令:

regsvr32 /s /u %windir%\SysWOW64\comctl32.ocx
regsvr32 /s /u %windir%\SysWOW64\mscomctl.ocx
del /y %windir%\SysWOW64\comctl32.ocx
del /y %windir%\SysWOW64\mscomctl.ocx
msiexec /passive /norestart /i KB2708437.msi
msiexec /passive /a KB2708437.msi
regtlib %windir%\SysWOW64\msdatsrc.tlb
Run Code Online (Sandbox Code Playgroud)

Visual Basic 6.0 Service Pack 6的安全更新:2012年8月14日下载 msi文件并将其重命名为KB2708437.msi.

注意:Service Pack 6下载的直接链接位于此处.

运行fix.cmd,问题将得到解决!

fix.cmd的作用是正确取消注册然后删除当前的MSCOMCTL.ocx和COMCTL32.ocx文件,然后应用最新的Visual Basic 6 SP6汇总补丁.事实上,该脚本强制安装补丁,然后通过更新每个文件重新安装,无论版本如何.最后它注册了msdatsrc.tlb类型库.

如果这对你有用,请告诉我.

================================================== ====================

高级解决方案

但是,如果您不小心损坏了注册表,则需要获得尽可能多的MSCOMCTL.ocx和COMCTL32.ocx版本.然后,您需要从较旧的版本开始返回到较旧版本并注册并取消注册 ocx文件.

最新版本的MSCOMCTL.ocx是2012年5月的6.1.98.39(v2.1),更有可能是系统上安装的并导致所有问题.

最古老的(遗留)版本是1998年6.1.97.82(v2.0)附带的Visual Basic 6附带的版本,或2005年4月附带的早期服务包6.1.97.86附带的版本.

例:

regsvr32 /s comctl32.6.0.98.34.ocx
regsvr32 /s /u comctl32.6.0.98.34.ocx

regsvr32 /s comctl32.6.0.81.6.ocx
regsvr32 /s /u comctl32.6.0.81.6.ocx 

regsvr32 /s comctl32.6.0.81.5.ocx
regsvr32 /s /u comctl32.6.0.81.5.ocx

regsvr32 /s mscomctl.6.1.98.39.(2.1).ocx
regsvr32 /s /u mscomctl.6.1.98.39.(2.1).ocx

regsvr32 /s mscomctl.6.1.98.34.ocx
regsvr32 /s /u mscomctl.6.1.98.34.ocx

regsvr32 /s mscomctl.6.1.97.86.ocx
regsvr32 /s /u mscomctl.6.1.97.86.ocx

regsvr32 /s mscomctl.6.1.97.82.(2.0).ocx
regsvr32 /s /u mscomctl.6.1.97.82.(2.0).ocx

regsvr32 /s /u %windir%\SysWOW64\comctl32.ocx
regsvr32 /s /u %windir%\SysWOW64\mscomctl.ocx

del /q %windir%\SysWOW64\comctl32.ocx
del /q %windir%\SysWOW64\mscomctl.ocx

msiexec /passive /norestart /i KB2708437.msi
msiexec /passive /a KB2708437.msi

regtlib %windir%\SysWOW64\msdatsrc.tlb   
Run Code Online (Sandbox Code Playgroud)

警告:

不要在互联网上搜索这些文件.要查找不同版本的OCX文件,请下载并解压缩官方Microsoft Installer程序包,如下所示:

2005年4月 - 微软KB896559

2008年12月 - 微软KB926857

2009年4月 - 微软KB957924

2012年5月 - 微软KB2708437

还建议运行CCleaner 4.0或更高版本以修复计算机上任何其他与ActiveX相关的问题.


小智 6

解决问题:

使用以下代码制作批处理文件:

@echo off
reg query "HKEY_CLASSES_ROOT\typelib\{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}\2.1"
if %errorlevel%==0 GOTO DELREGKEY
if %errorlevel%==1 GOTO REGISTEROCX

:DELREGKEY
reg delete hkcr\typelib\{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}\2.0 /f

:REGISTEROCX
if exist %systemroot%\SysWOW64\cscript.exe goto 64 
%systemroot%\system32\regsvr32 /u mscomctl.ocx /s
%systemroot%\system32\regsvr32 mscomctl.ocx /s
exit

:64 
%systemroot%\sysWOW64\regsvr32 /u mscomctl.ocx /s
%systemroot%\sysWOW64\regsvr32 mscomctl.ocx /s
exit
Run Code Online (Sandbox Code Playgroud)


小智 5

我用win7也有同样的问题。今天我解决了这个问题,通过在我的项目中加载很多错误只是命令在转到 Project=> Component => Microsoft Windows Common Controls 6.0 (SP6) 然后保存项目(文件使用是 c:\windows\syswow64 \mscomctl.ocx)