48

Windows Update でセキュリティ更新プログラムKB2687323をインストールした後、VB6 プロジェクトを読み込めません。表示されるエラー メッセージは、「'[project_vbp_path]/MSCOMCTL.OCX' could not be loaded--Continue Loading Project?」です。メッセージ内のパスは、コントロールの登録済みパスではなく、vbp ファイル フォルダー パスであることに注意してください。

詳細:

  1. MSCOMCTL.OCX は、通常の system32 フォルダーに登録されます。
  2. 更新が正常に実行される 1 時間前に、まったく同じプロジェクトによって生成された実行可能ファイルが実行され、更新された 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 をロードできませんでした」という状況では、新しいプロジェクトを開始することが解決策の 1 つとして考えられます。フォームの 1 つにコントロールを配置し、vbp ファイルをメモ帳でチェックして、予想されるバージョンを確認します。


または、はるかに簡単な方法:

(以下のボブの貴重なコメントの後にこのセクションを追加しました)

メモ帳で VBP プロジェクト ファイルを開き、VB6 がプロジェクトを自動的に 2.1 にアップグレードして削除するのを妨げている厄介な行を見つけることができます。

NoControlUpgrade=1
于 2012-08-16T07:43:12.857 に答える
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レジストリ キーです。この問題に関する詳細な背景情報については、こちらを参照してください。

別の実用的なソリューションを次に示します。

この解決策は、Office パッチ ファイルの登録を解除せずに、MSCOMCTL.ocx および COMCTL32.ocx を削除、置換、および再登録することによって、レジストリが破損していないことを前提としています。

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 月 - Microsoft KB896559

2008 年 12 月 - Microsoft KB926857

2009 年 4 月 - Microsoft KB957924

2012 年 5 月 - Microsoft 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 に答える
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. 右側のパネルで、[互換性フラグ] をダブルクリックし、値を 16 進数 0x400 (10 進数 1024) から 0 に変更して、[OK] をクリックします。
  4. MSCOMCTL.OCX の「2.0」バージョンを使用するアプリケーションを起動します。設計どおりに実行する必要があります。

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,1back を変更しただけで、すぐに実行できます。#2.0この種の問題は以前にも発生したため、Microsoft が説明し、それに応じて解決することを願っています。ありがとう。

于 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 に答える
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

次の 2 行を次のように修正します。

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 に答える