更新KB 2687323后,VB6 IDE无法加载MSCOMCTL.OCX
在Windows更新安装安全更新KB2687323后 ,我的VB6项目无法加载。 显示的错误消息是“'[project_vbp_path] /MSCOMCTL.OCX'无法加载 – 继续加载项目?”。 请注意,邮件中的path是vbp文件文件夹path而不是控件的注册path。
细节:
- MSCOMCTL.OCX注册在通常的system32文件夹中。
- 由完全相同的项目产生的可执行文件,在更新运行正常之前一小时,并加载更新的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.0
registry项。 你可以在这里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:
- 运行registry编辑器(regedit.exe或regedt32.exe)
- 在左侧窗格中,导航到HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Internet Explorer \ ActiveX兼容性项{BDD1F04B-858B-11D1-B16A-00C0F0283628}
- 在右侧面板中,双击“兼容性标志”,将hex0x400(十进制1024)的值更改为0,然后单击确定。
- 启动使用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版本
- https://support.microsoft.com/zh-cn/kb/3096896 (文件date:2015年11月5日)
- https://www.microsoft.com/en-us/download/details.aspx?id=50722
一些版本信息:
- 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)为我解决了这个问题。