読者です 読者をやめる 読者になる 読者になる

Windows7 に VB6.0 をインストールするとエラーが出る

仕事でまだ VB6.0 を使うケースがあるが、PCの方は、いい加減XPからWindows7に乗り換えなければなりません。

幸いにして、VB6.0 ランタイムは、Windows7/8 になっても未だに提供されており、初期状態でプレインストールされています(ランタイム全てではないですが)。

しかし、Visual Basic 6.0 (ランタイムじゃなく開発ツールのほう;以降こちらをVB6.0と書く)となるとちょっと事情が異なります。

VB6.0 を素直に Windows7 にインストールし、ServicePack 6 をあて、さらに VB6 SP6 のセキュリティロールアップバッチを適用した場合、どうにも正常に動作しません。

具体的には、以下の2つのエラーがちょくちょく発生します。

「システムレジストリへのアクセスでエラーが発生しました」

 これは、どうも VB6.0 自身がレジストリを書き換えたいときに発生するようです。(OCXファイルのキャッシュであるOCAやEXDファイルを生成して、それらをレジストリに登録する、など)

要は、VB6.0 に管理者権限がないと。

大抵のアプリなら、ここで UAC に従って「変更させて良いか」を尋ねてくるのですが、VB6.0 の場合はなぜか UAC が機能せず、エラーが表示されるようです。

そしてなぜか2回目以降は表示されません。果たして、レジストリに登録されたのか、それとも VB6.0 が登録を諦めたのか?

最も簡単な解決方法は、VB6.EXE のプロパティ → [互換性] タブ → [すべてのユーザーの設定を変更] → [管理者としてこのプログラムを実行する] にチェックを入れることでしょうね。

VB6.0 の起動時に毎回 UAC のウィンドウで問い合わせが来ますが、少なくともレジストリエラーは発生しなくなります。

初めて VB6.0 を起動するよりも前に設定することをお勧めします。

「オブジェクトライブラリが登録されていません」

とあるプロジェクトでとあるコンポーネントを追加しようとしたとき、ちゃんと OCX ファイルがレジストリに登録されているにも拘らず、登録されていないという旨のエラーがでて追加できないことがあります。

特に、MSCOMCTL.OCX での発生確率が高いようです。

解決法としては、regsvr32 で手動でOCXファイルを登録しなおしたり、自分でプロジェクトファイルをいじって OCX のバージョンを下げたりといった方法が散見されますが、うちの場合はそれでもアウトでした。

この場合は、regtlib.exe というコマンド(たぶん Visual Basic 6.0 .NET Framework に付いてくる)で、タイプライブラリを再登録すると良いようです。

例えば Windows7 HomeEdition (x86) での例を挙げますと、

  1. コマンドプロンプト(Cmd.exe)を管理者権限で起動する。
  2. 下のコマンドを実行する。
    > C:\Windows\regtlib.exe C:\Windows\system32\msdatsrc.tlb

これで、登録できなかったコンポーネントも登録できるようになると思います。

 

以上、備忘録として。