Windows VistaとVB6

Posted on :| コメント (0)

 吉田はWindowsの開発環境にVB6を選択しています。 Microsoft純正開発環境でRADツールというのが選定理由ですが、 このソフトは1998年に発売されたので世代的にもガタが来ているのが難点です。競馬ソフトの開発環境には、 VB6の他にDelphiが利用されています(TARGETなどはこちら)。
 VB6もWindowsXPの頃は問題はなかったのですが、Vistaでは色々と支障が出てきました。

 

■Windows VistaとVB6開発環境

 MicrosoftはVisual Studio6(VC++6、VB6)のうち、VB6のみWindows Vistaでサポートすると明言しました。しかし、Windows Vistaに開発環境をインストールするだけでもちょっと大変です。以下がその手順と注意です。

  1. Visual Studio6のうち、VB6に関する部分を選択してインストール
  2. CDの自動実行からでなく、Setup.exeを「管理者権限で実行」を選択してインストール
  3. VB6SP6をダウンロードして適用(SP5以前はVISTAにインストールできない)
  4. これで一応インストール完了

 実際にプロジェクトを開いてみて、OLEオートメーションエラーやレジストリ関連のエラーが出る場合は、VB6.EXEを 「管理者権限で実行」しなければならない。
 Visual Studioは元々管理者権限を要求するソフトですが、 Vistaは管理者でログインしていてもXPのように管理者で動作しないので、各所でエラーが出るのです。 これはOSのバージョン毎にMicrosoftの方針がころころ変わった結果です。 VISTAの方法も次のOSで見直しが掛かるかもしれません(UACは闇雲にハイを押してしまうので、あまり良い方法ではありません)。

 また、管理者権限で実行をしたにもかかわらず、コンパイル時にエラーが出ます。 これはActiveXプロジェクトを作っているときに、OLEオートメーションのために必要な情報をレジストリに書き込めないためです。 VB6でのアプリケーション開発をする場合には、WindowsXPの方がいいでしょう。

 

■VISTAにVB6製ソフトを対応させるコツ

 ここからは防備録として書いておきます。VB6製のソフトを作っている人は、 恐らくVISTAの間はVB6で何とか乗り切ろうと考えているはずです。後継バージョンのVB.NET、 VB2005へ移行させるにはコストがかかるためです。
 吉田はVISTAのサポートが切れる2014年までには完全にVB2005や2008に移行したいと考えていますが、 現在メンテしているソフトはそのままVB6で開発を続けるつもりです(マイグレーションのための準備はしますが)。
 以下は吉田が自分で調べた結果を書いておきます。VB6を使っている人は活用してください。ただし、責任は負いませんので自己責任で。

(1)仮想化対策

 Windows Vistaではソフトウェアによるシステム領域への書き込みを許可していません。これを行おうとすると、 最悪UACがエラーを出してアプリケーションを強制終了したり、仮想化が働きます。仮想化はこなれていないので、挙動が不安定なので、 出来る限り仮想化を避ける必要があります。

 レジストリはHKEY_CURRENT_USERを利用します。 HKEY_LOCAL_MACHINEへの書き込みは仮想化の対象となり、挙動が不安定になります。

 Program Filesフォルダも仮想化の対象です。アプリケーションの作成するデータはProgram Filesのインストール先に作りたいと思いますが、 仮想化されてC:\Users\AppData\VirtualStore\Program Filesにとばされてしまいますので、やはり別のフォルダに作成した方がいいでしょう。
 最も安直なのは、Cドライブ直下に自分のフォルダを作る方法です。IntelやAti、 Microsoftなどの大手ベンダーは未だにやっていますが、正直言って行儀が悪いし、気分も良くありません。 この方法はWindows3.1以前のOSでやられていた方法です。取りあえず、データ用のフォルダを取得して、 そこに書き込んだ方がいいでしょう。ちなみに、システムフォルダに対する読み込みは可能なので、 App.Pathを使って自フォルダを取得する際には注意が必要です。

(2)インストーラ

 VistaではVB6ランタイムをこれまで通りにインストールしようとするとエラーになります。 吉田はInnoSetupをインストーラに選択していますが、「STDOLE2.TLB」 というタイプライブラリをタイプライブラリとして登録しようとするとエラーになります。 タイプライブラリの指定を外せば問題なくインストールできます。

 Vistaではレジストリの扱いが変わっているので、レジストリに登録すべきDLLやOCXがある場合には注意しましょう。最も、 ランタイムを初めとするほとんどのファイルはVistaにあらかじめインストールされています。

(3)ActiveX.exe

 これが最も悩んだ点です。シンプルぱっと2をVista対応させたとき、初回起動時に「管理者権限で実行」しないと 「予期せぬエラー」が出たのですが、この原因が掴めずずっと悩んでいました。
 ここ数日間の集中調査で判明したのは、Vista上のVB6は、 ActiveXをコンパイルした際にCLSIDなどの必要な情報をレジストリに登録できないということです。

 ActiveX.exeは実行可能なActiveXファイルなので、 初回起動時もしくはインストール時にレジストリにCLSIDを登録する必要があります。通常は「REGSVR32 xxxx.EXE /regserver」か、アプリケーション起動時に「xxxx.EXE /RegServer」 とすれば登録できます(xxxx.exeは開発したソフト名)が、この行為自体が管理者権限が必要で、UACダイアログが出ないで 「予期せぬエラー」になります。「このぐらいのことは予期しろよ、おまえのところで推進していた技術だろ」 と突っ込みたくなりますが、Microsoftのやることはちぐはぐなのでソフト側で注意する必要があります。

 吉田が取った対策は、InnoSetupのスクリプトに下記のセクションを追加したことです。

[Run]
; NOTE: The following entry contains an English phrase ("Launch"). You are free to translate it into another language if required.
Filename: {app}\simplepat2.exe; Parameters: /RegServer; WorkingDir: {app}; Flags: runhidden

[UninstallRun]
Filename: {app}\simplepat2.exe; Parameters: /UnregServer; WorkingDir: {app}; Flags: runhidden; Tasks:

 ActiveX.exeはセルフレジストレーション機能があるので、 アプリケーション起動時に/regserverを付ければ自動的にレジストリに登録されます。これをインストーラで指定すればよいのです。 アンインストール時には/UnregServerを忘れずに。

 

コメント

コメントフォームに記入し投稿してください





Search
最近の記事
カテゴリー
過去の記事
Comments
TrackBacks
Feed
Powered by