48

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。

4

16 回答 16

60

经过数小时的努力、系统恢复、注册、注销周期和一夜睡眠,我设法查明了问题所在。事实证明,项目文件包含以下行:

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
于 2012-08-16T07:43:12.857 回答
41

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

命令 :

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

或者

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

我希望这有帮助。

于 2013-04-19T17:20:20.040 回答
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

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   

警告:

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

2005 年 4 月 - 微软 KB896559

2008 年 12 月 - 微软 KB926857

2009 年 4 月 - 微软 KB957924

2012 年 5 月 - 微软 KB2708437

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

于 2016-02-08T18:29:35.543 回答
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
于 2012-08-21T13:22:45.727 回答
5

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

于 2013-03-13T04:41:07.940 回答
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 Update ( kb957924 )。

于 2014-11-11T14:31:51.620 回答
2

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

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

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

清除 KillBit:

  1. 运行注册表编辑器(regedit.exe 或 regedt32.exe)
  2. 在左侧面板中,导航到键 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility{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,因此一旦应用程序启动并加载控件,您就可以避免重置。

于 2012-08-22T12:49:57.843 回答
2

NoControlUpgrade=1我在我的 vbp 项目中找不到。相反,我在 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它可以立即运行。此类问题以前也出现过,希望微软做出相应的解释和解决。谢谢。

于 2013-02-18T07:45:34.053 回答
2

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

  • 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)
于 2016-05-10T11:03:01.263 回答
1

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

于 2012-12-19T14:13:17.363 回答
1

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

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

如果没有其他方法对您有用,则值得一试。

于 2013-04-29T08:17:19.193 回答
1

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

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

regtlibv12.exe msdatsrc.tlb

于 2014-03-14T18:53:34.493 回答
0

我最近把我所有的资源都放在了一个 Windows 8 32 盒子上。加载mscomctl.ocx现有项目时遇到问题。

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

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

于 2013-02-08T12:20:40.223 回答
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` 
于 2013-03-31T21:35:29.397 回答
0

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

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)为我解决了这个问题。

于 2016-11-24T19:21:05.340 回答
0

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

于 2019-04-27T07:45:06.453 回答