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

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

细节:

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

安全更新说明指出MSCOMCTL.OCX有一个新的固定版本。 所以我检查了“升级ActiveX控件”checkbox的项目属性。 我尝试了两种方法。 检查和不检查无济于事。 VB6 IDE拒绝加载升级的OCX。

经过几个小时的努力,系统恢复,注册,取消注册周期和夜间睡眠,我已经设法查明问题。 事实certificate,该项目文件包含下面的行:

Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0; MSCOMCTL.OCX 

版本信息“2.0”似乎是不加载的原因。 在记事本中将其改为“2.1”解决了这个问题:

 Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.1#0; MSCOMCTL.OCX 

所以在类似的“OCX无法加载”的情况下,一个可能的解决方法就是开始一个新的项目。 把控制放在其中一个窗体上,用记事本检查vbp文件,看看它是什么版本。

…或者更简单的解决scheme:(我已经在Bob的宝贵评论之后添加了这个部分)你可以在记事本中打开你的VBP项目文件,find阻止VB6将项目自动升级到2.1并删除的令人讨厌的行:

 NoControlUpgrade=1 

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

命令:

 cd C:\Windows\System32\ regtlib msdatsrc.tlb 

要么

 cd C:\Windows\SysWOW64\ regtlib msdatsrc.tlb 

我希望这有帮助。

解决问题:

使用以下代码创build一个batch file:

 @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 

问题:

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.0registry项。 你可以在这里find关于这个问题的详细背景信息。

这是另一个工作解决scheme:

该解决scheme假定您没有通过删除,replace和重新注册MSCOMCTL.ocx和COMCTL32.ocx而不注销Office修补程序文件来损坏您的registry。

创build一个名为fix.cmd的batch file,并在其中放置以下命令:

 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 

从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汇总修补程序。 实际上,该脚本通过更新每个文件来强制安装补丁,然后重新安装,而不pipe版本如何。 最后它注册msdatsrc.tlbtypes库。

请让我知道这是否适合你。

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

高级解决scheme

但是,如果您不小心损坏了registry,则需要获取许多版本的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 

警告:

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

2005年4月 – 微软KB896559

2008年12月 – 微软KB926857

2009年4月 – 微软KB957924

2012年5月 – 微软KB2708437

还build议运行CCleaner版本4.0或更高版本来解决您的计算机上的任何其他ActiveX相关的问题。

我使用win7并有同样的问题。 今天我解决了这个问题,通过加载与我的项目很多错误,只是让命令继续后,转到项目=>组件=> Microsoft Windows公共控制6.0(SP6),然后保存项目(文件使用是C:\ WINDOWS \ SYSWOW64 \ MSCOMCTL.OCX)

在某些计算机上,我发现MSCOMCTL.OCX的“2.0”版本已经添加到ActiveX KillBits列表中,因此控件将不被允许加载或运行 – 即使在devise视图中。 更新到“2.1”版本将解决此问题,并且是推荐的解决scheme。

在严重的情况下,如果您现在需要运行程序,或者无法访问源代码,或者该控件在大型模块化项目中使用了400次,则可以使用“大锤”方法并更新registry重新启用控件:

**
警告 :以错误的方式编辑Windowsregistry可能会让您的电脑变得糟糕。 如果您不确定自己在做什么,请保持独立,或继续学习。
**

清除KillBit:

  1. 运行registry编辑器(regedit.exe或regedt32.exe)
  2. 在左侧窗格中,导航到HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Internet Explorer \ ActiveX兼容性项{BDD1F04B-858B-11D1-B16A-00C0F0283628}
  3. 在右侧面板中,双击“兼容性标志”,将hex0x400(十进制1024)的值更改为0,然后单击确定。
  4. 启动使用MSCOMCTL.OCX的“2.0”版本的应用程序; 它应该按照devise运行。

ActiveX KillBits列表旨在为Microsoft提供禁用被认为具有安全风险的控制的手段,并且他们devise了这样一种机制,即ActiveX KillBits列表将在表面上随机的时间重新应用于系统除了安装更新时,您需要计划重新应用registry更改。 制作一个registry合并文件工作的非常好,但是每次运行应用程序时都不是这样,因为这不是一个安静的过程(有一些方法可以使用Windows脚本悄悄地执行此操作,但是您必须了解拥有)。 KillBit仅在应用程序请求控件时进行检查,所以一旦应用程序启动并加载控件,就可以安全地重置。

我的解决scheme是安装这个VB6补丁。 我在Server2008(32位)上。

http://www.microsoft.com/en-us/download/details.aspx?id=10019

这让我很伤心,我们在2014年仍然在谈论这个问题……但是现在是这样。 🙂


从puetzk的评论:这些是过时的:您想要使用Microsoft Visual Basic 6.0 Service Pack 6累积更新 ( kb957924 )。

与使用MSCOMCTL.OCX的VBAmacros相同的问题。 问题仍然没有解决像“reg / unreg mscomctl.ocx”解决scheme使用上面的鲁米信息。 编辑我的* .dot文件,search#2.0#0,更改为#2.1#0 – >它的工作

我有这个问题,并尝试许多不同的解决scheme。 他们没有为我工作,虽然我认为这个错误发生了几个不同的原因。 我的解决办法是在这里回答这个问题:

https://stackoverflow.com/a/15785253/2240058

它值得一试,如果没有别的工作给你。

这个问题今天神秘地出现了。 我没有做任何Windows更新,所以我不知道原因。

这固定它(在提升的命令提示符下):

regtlibv12.exe msdatsrc.tlb

我在vbp项目上找不到NoControlUpgrade=1 。 相反,我在xp和windows7 x64上开发。 当我将项目从窗口7移到xp时,发生错误。

从我发现,这些是不同的:

 Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0; MSCOMCTL.OCX Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.1#0; MSCOMCTL.OCX 

我只是将#2,1更改回vbp文件#2.0 ,它可以立即运行。 以前发生过这样的问题,所以希望微软相应地解释和解决。 谢谢。

对我来说,这个解决scheme就像一个魅力: http : //home.pacific.net.hk/~edx/bin/readmeocx.txt

修正这两行:

 Object={F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0; COMDLG32.OCX Object={831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0; MSCOMCTL.OCX 

search文件(.vbp和.frm),如下所示:

 Begin ComctlLib.ImageList ILTree Begin ComctlLib.StatusBar StatusBar1 Begin ComctlLib.Toolbar Toolbar1` 

行可能是这样的:

 Begin MSComctlLib.ImageList ILTree Begin MSComctlLib.StatusBar StatusBar1 Begin MSComctlLib.Toolbar Toolbar1` 

我最近把所有的资源都放在一个windows 8 32上。 有问题与现有的项目加载mscomctl.ocx

我创build了一个新项目并添加了通用控件(全部)。 保存项目并重新加载它没有问题。

当你比较项目标题新旧旧的使用引用= * \等等等等。 我发现删除这个用Object = {blah}replace它解决了这个问题。

您可能会尝试检查您的registry

  • HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes下\ {types库831FDD16-0C5C-11D2-A9FC-0000F8754DA1}

如果是2.1版本,则会导致无法加载MSCOMCTL.OCX的问题。

您可以恢复到2.0 verion( 不仅复制文件,你应该unregiser 2.1并注册恢复的文件

要么

你可以尝试最新的2.2版本

一些版本信息:

  • 6.0.88.62(2.0)
  • 6.1.97.82(2.0)
  • 6.1.98.34(2.1)<<<不适用于我
  • 6.1.98.46(2.2)

在尝试这里提到的事情之后,我仍然遇到问题。 最后,事实certificate,我的SysWOW64文件夹中有错误版本的mscomctl.ocx 。 我发现了以下版本:

 Mar. 09, 2004 01:00 AM 1,081,616 mscomctl.ocx Jun. 06, 2012 07:59 PM 1,070,152 mscomctl.ocx Dec. 08, 2015 03:57 AM 1,070,232 MSCOMCTL.OCX 

获取最后一个(1,070,232)为我解决了这个问题。