仕事でまだ 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) での例を挙げますと、
- コマンドプロンプト(Cmd.exe)を管理者権限で起動する。
- 下のコマンドを実行する。
> C:\Windows\regtlib.exe C:\Windows\system32\msdatsrc.tlb
これで、登録できなかったコンポーネントも登録できるようになると思います。
以上、備忘録として。