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

时间:2012-08-16 07:43:13

标签: vb6

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

详细说明:

  1. MSCOMCTL.OCX已在通常的system32文件夹中注册。
  2. 完全相同的项目生成的可执行文件,在更新前一小时运行正常并加载更新的MSCOMCTL.OCX(我已使用Process Explorer检查过它)。
  3. 安全更新说明指出MSCOMCTL.OCX具有新的固定版本。所以我检查了“升级ActiveX控件”复选框的项目属性。我试过两种方式;检查和取消选中无济于事。 VB6 IDE拒绝加载升级后的OCX。

15 个答案:

答案 0 :(得分:53)

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

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文件以查看它所期望的版本。


或更简单的方法:

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

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

NoControlUpgrade=1

答案 1 :(得分:41)

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

命令:

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

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

我希望这会有所帮助。

答案 2 :(得分: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注册表项。您可以找到有关此问题的详细背景信息here

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

该解决方案假设您未通过删除,替换和重新注册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

Security update for Visual Basic 6.0 Service Pack 6: August 14, 2012下载msi文件并将其重命名为 KB2708437.msi

注意:Service Pack 6下载的直接链接位于HERE

运行 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附带的版本,或早期服务包附带的版本 6.1.97.86 < / strong> 2005年4月。

示例:

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   

警告:

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

2005 Apr - Microsoft KB896559

2008 Dec - Microsoft KB926857

2009 Apr - Microsoft KB957924

2012 May - Microsoft KB2708437

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

答案 3 :(得分: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

答案 4 :(得分:4)

我使用win7并遇到同样的问题。 今天我解决了这个问题,通过加载我的项目的许多错误只是命令继续之后转到Project =&gt;组件=&gt; Microsoft Windows Common Controls 6.0(SP6)然后保存项目(文件使用是c:\ windows \ syswow64 \ mscomctl.ocx)

答案 5 :(得分:3)

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

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

令我感到难过的是,我们在2014年仍然在谈论这个......但现在就是这样。 :)


来自puetzk的评论:这些已过时:您希望使用Microsoft Visual Basic 6.0 Service Pack 6 Cumulative Updatekb957924)。

答案 6 :(得分:2)

在某些计算机上,我发现{@ 1}}的“2.0”版本已添加到ActiveX KillBits列表中,因此不允许加载或运行控件 - 即使在设计中也是如此视图。更新到“2.1”版本将解决此问题,是推荐的解决方案。

在关键情况下,您必须“现在”运行程序,或者您无法访问源代码,或者控件在大型模块化项目中使用了400次,可以使用“大锤子”方法并更新注册表以重新启用控件:

**
警告:以错误的方式编辑Windows注册表会使计算机陷入困境。如果你不确定自己在做什么,请不要管它,或者在继续学业之前先上学 **

清除KillBit:

  
      
  1. 运行注册表编辑器(regedit.exe或regedt32.exe)
  2.   
  3. 在左侧面板中,导航至键HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Internet Explorer \ ActiveX   兼容性{BDD1F04B-858B-11D1-B16A-00C0F0283628}
  4.   
  5. 在右侧面板中,双击“Compatibility Flags”,将值从Hex 0x400(十进制1024)更改为0,然后单击“确定”。
  6.   
  7. 启动使用MSCOMCTL.OCX的“2.0”版本的应用程序;它应该按照设计运行。
  8.   

ActiveX KillBits列表旨在为Microsoft提供禁用被视为安全风险的控件的方法,并且他们设计了一种机制,使ActiveX KillBits列表可以在看似随机的情况下重新应用于系统次,除了安装更新时,您还需要计划重新应用注册表更改。制作一个注册表合并文件效果非常好,但是每次应用程序运行时都不是你想做的事情,因为它不是一个安静的过程(有很多方法可以使用Windows Scripting安静地执行此操作,但是你必须在拥有)。只有在应用程序请求控件时才会检查KillBit,因此一旦应用程序启动并加载控件,您就可以安全地重置。

答案 7 :(得分:2)

您可以尝试检查注册表

  • HKEY_LOCAL_MACHINE \ SOFTWARE \类\类型库{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}

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

您可以恢复到2.0版本(不仅要复制文件,还应该取消注册2.1并注册已恢复的文件

或者

您可以尝试最新的2.2版本

某些版本信息:

  • 6.0.88.62(2.0)
  • 6.1.97.82(2.0)
  • 6.1.98.34(2.1)&lt;&lt;&lt;不适合我
  • 6.1.98.46(2.2)

答案 8 :(得分:1)

我在我的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,它可以立即运行。 之前发生过这类问题,所以希望微软相应地解释和解决它们。 感谢。

答案 9 :(得分:1)

我遇到了这个问题并尝试了许多不同的解决方案。他们不适合我,虽然我认为这个错误出于几个不同的原因。我的解决方案是在这里回答这个问题:

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

如果没有别的东西适合你,那值得一试。

答案 10 :(得分:1)

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

这修复了它(在提升的命令提示符下):

regtlibv12.exe msdatsrc.tlb

答案 11 :(得分:0)

我最近将所有资源都放在了Windows 8 32的盒子上。是否有问题将mscomctl.ocx加载到现有项目中。

我创建了一个新项目并添加了公共控件(全部)。保存项目并重新加载它没问题。

当您比较项目标题new vs old时,旧标题使用reference = * \ blah blah。我发现删除了这个替换它用Object = {blah}来解决问题。

答案 12 :(得分:0)

对我来说,这个解决方案就像一个魅力: 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

在文件(.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` 

答案 13 :(得分:0)

在尝试了这里建议的事情后,我仍然遇到问题。最后,我发现我的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)为我解决了这个问题。

答案 14 :(得分:0)

我遇到了类似的麻烦,有一个使用VB6编写的运行了10年的程序,现在客户想要进行一些重大修改,我的所有机器现在都是Windows 10;无法打开项目,它总是那讨厌的mscomctl.ocx错误。我做了很多事情,但无法解决问题。然后,我想到了轻松的方法,我下载了最新的mscomctl(mscomctl.ocx 然后打开一个新项目,添加所有组件,例如mscomctl,activx控件等,将其保存并在记事本中打开此新创建的项目文件,然后复制确切的详细信息并替换为原始项目。旧项目正常打开,没有大惊小怪!我希望这种经验能对某人有所帮助。