【问题标题】:VB6 IDE cannot load MSCOMCTL.OCX after update KB 2687323更新 KB 2687323 后 VB6 IDE 无法加载 MSCOMCTL.OCX
【发布时间】:2012-08-12 12:57:55
【问题描述】:

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

详情:

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

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

【问题讨论】:

  • 我在“'升级 ActiveX 控件'复选框无效”问题中的原始陈述是错误的。感谢 Bob,我现在知道我没有设法更改这个 vbp 属性。它卡在“不升级”中。这导致了问题。详细信息在 Bob Riemersma 的评论和下面我的回答中。
  • 当心:自 2013 年 3 月下旬以来,出现了导致此问题的新原因,有关详细信息,请参阅 auto 的答案。

标签: vb6


【解决方案1】:

经过数小时的努力、系统还原、注册、取消注册周期和一夜睡眠,我设法查明了问题所在。原来项目文件包含以下行:

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

【讨论】:

  • 有趣。我检查了,我也有这个更新的 OCX。然后我挖出了一个使用它的旧项目,果然它有 2.0,但它加载、编译和运行都很好。创建和保存一个新项目确实显示了 2.1,但它在这里似乎并不重要。
  • 事实证明 Bob Riemersma 也是对的。在他发表评论后,我明白了原因。谢谢鲍勃。不同之处在于我的 vbp 中有一条令人讨厌的行说明“NoControlUpgrade = 1”,它控制项目属性中的“升级 ActiveX 控件”复选框。勾选后,此行不会出现在 vbp 中,它会默默地将 OCX 升级到 2.1。如果未选中(即为 1),则无法加载项目。我将在一分钟内编辑我的答案以反映这一发现。
  • 你是对的,只是我的结果是相反的,它是 2.1,我已经将其更改为 2.0。现在它正在工作(在 xp 上):)
  • 非常感谢您在 Windows 7 上为我提供 2.1,我只是将其更改为 2.0
  • 这是正确答案。我不得不在 Win 10 上降级到 2.0。
【解决方案2】:

解决问题:

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

@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

【讨论】:

  • Silvio 这些问题可能是相关的,但这不是 VB6 IDE 问题的答案。我认为你应该从这里删除它。作为您的参考文献状态。修复是针对另一个问题。
  • 虽然我认为这不是解决这个问题的正确方法,但它确实起到了作用。在我的工作中,我们的构建服务器仍然在 mscomctl 2.0 上运行,因此在我们的 windows 7 机器上回滚到 2.0 很方便。
  • 单独重新注册 mscomctl.ocx 并不能解决问题,因为问题(在我的情况下)是由未正确注册的更高版本引起的,并且 COM 总是在指定 non 时选择最新版本。删除注册并然后注册 mscomctl.ocx 解决了我的问题。它修复了尝试创建引用 mscomctl 的新项目的问题以及尝试加载专门引用版本 2.0 的现有项目的问题。显然那里的版本被忽略了,因为 2.1 注册仍然受到干扰。
【解决方案3】:

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

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

**
警告:以错误的方式编辑 Windows 注册表可能会严重破坏您的计算机。如果您不确定自己在做什么,请不要管它,或者在继续之前接受一些教育。
**

清除KillBit:

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

ActiveX KillBits 列表旨在为 Microsoft 提供禁用被认为存在安全风险的控件的方法,并且他们设计的机制使得 ActiveX KillBits 列表将看似随机地重新应用于系统时间,除了安装更新的时间,因此您需要计划重新应用注册表更改。制作注册表合并文件效果很好,但不是每次应用程序运行时都想做的事情,因为这不是一个安静的过程(有一些方法可以使用 Windows 脚本安静地做到这一点,但你必须在你的自己的)。仅当应用程序请求控件时才检查 KillBit,因此一旦应用程序启动并加载控件,您就不会被重置。

【讨论】:

    【解决方案4】:

    使用 MSCOMCTL.OCX 的 VBA 宏也存在同样的问题。 使用“reg/unreg mscomctl.ocx”等解决方案仍未解决问题 使用了鲁米的上述信息。 编辑我的 *.dot 文件,搜索#2.0#0,将其更改为#2.1#0 --> 成功了

    【讨论】:

      【解决方案5】:

      我最近将所有源代码都放在了 Windows 8 32 机器上。使用现有项目加载 mscomctl.ocx 时遇到问题。

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

      当您比较新旧项目标头时,旧项目标头使用reference=*\blah blah。我发现删除它并用 Object={blah} 替换它解决了问题。

      【讨论】:

        【解决方案6】:

        我在我的 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
        

        我刚刚将vbp文件上的#2,1改回#2.0,它可以立即运行。 此类问题以前也出现过,希望微软做出相应的解释和解决。 谢谢。

        【讨论】:

        • 如果您被困在只安装了 2.0 版 COMCTL.OCX 的机器上(例如只有 VB6 的虚拟 Win7 机器),此解决方案应该适合您。对于所有版本的控件,GUID 保持不变。
        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          对我来说,这个解决方案很有魅力: 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` 
          

          【讨论】:

            【解决方案9】:

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

            命令:

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

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

            我希望这会有所帮助。

            【讨论】:

            • 这个为我修好了。 msdatsrc.tlb 与 MSCOMCTL 到底有什么关系?!?非常感谢!
            • 自 2013 年 3 月下旬出现“对象库未注册”的消息似乎有新的原因。上面的代码解决了它。
            • 哇也为我工作。我有 Win7 但没有 regtlib.exe。但这使 %SystemRoot%\Microsoft.NET\Framework\v4.0.30319\regtlibv12.exe msdatsrc.tlb 的诀窍在 VB6 中不再有 未注册的对象库:D。是的,奇怪的是,MSDATASRC => Microsoft Data Source Interfaces for ActiveX Data Binding 与 MSCOMCTL 有什么关系?好吧,也许是因为 MSCOMCT2 中的“DTPicker”(访问某些 Database/Recordsets)以某种方式链接到 MSCOMCTL。
            【解决方案10】:

            我遇到了这个问题并尝试了许多不同的解决方案。尽管我认为由于几个不同的原因而发生此错误,但它们对我不起作用。我的解决方案在我对这个问题的回答中:

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

            如果没有其他方法适合您,值得一试。

            【讨论】:

            • 虽然你的解决方案对我不起作用,但这个问题的另一个答案是我的问题的实际解决方案。感谢您为我指明正确的方向。
            【解决方案11】:

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

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

            regtlibv12.exe msdatsrc.tlb

            【讨论】:

              【解决方案12】:

              我的解决方案是安装这个 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 Update (kb957924)。

              【讨论】:

              【解决方案13】:

              问题:

              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 年随 Visual Basic 6 提供的版本6.1.97.82 (v2.0),或者是随早期服务包提供的版本6.1.97.86 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 安装程序包,例如:

              2005 Apr - Microsoft KB896559

              2008 Dec - Microsoft KB926857

              2009 Apr - Microsoft KB957924

              2012 May - Microsoft KB2708437

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

              【讨论】:

              • 最好的解决方案是使用此答案中提到的 2.2 版。
              • 我的虚拟机 (Windows XP) 有问题。我运行命令Regsvr32 "C:\Windows\System32\MSCOMCTL.OCX" 然后解决了问题。
              【解决方案14】:

              您可以尝试检查您的注册表

              • HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib{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)
              • 6.1.98.46 (2.2)

              【讨论】:

              • 什么是 Windows 10?当我加载我的项目时,它显示它无法加载 MSCAL.OCX - 当我用记事本打开 .vbp 文件时,它显示它是#7.0#0; MSCAL.OCX
              【解决方案15】:

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

              【讨论】:

                【解决方案16】:

                我也遇到过类似的问题,有一个用VB6编写的程序运行了10年,现在客户想进行一些重大修改,我所有的机器现在都是windows 10;无法打开项目,总是那个讨厌的 mscomctl.ocx 错误。我做了很多事情,但无法解决问题。然后我想到了简单的方法,我下载了最新的 mscomctl ( 然后打开一个新项目,添加所有组件,如 mscomctl、activx 控件等,保存并在记事本中打开这个新创建的项目文件,然后复制确切的细节并在原始项目中替换......和宾果游戏!旧项目正常打开,没有任何大惊小怪!我希望这次经历对某人有所帮助。

                【讨论】:

                  猜你喜欢
                  • 2016-09-08
                  • 2019-08-10
                  • 2019-03-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多