2003.3.5

 VBってそんなに悪いのか?

 よく開発者の中でVBの悪口が言われる。マシンにVBがインストールされていたら不安定になるとか、VBで作ったプログラムをインストールするとマシンが不安定になるとか。
 僕はVBが悪いとは思わない。確かに、VBで作ったアプリケーションをインストールするとマシンが不安定になることもある。
 だが、そのことがVBが悪いと言うことにはならない。
 僕がだめな原因だと思っているのは、ディストリビューションウィザードとそれを使用して作ったインストーラーだ。

 インストーラーといえば、MS-DOS/Windows3.1の頃はこれといって決まったインストール手順もなく、各メーカーが独自で作っていたものが多い。
 MS-DOSの頃のインストーラーの問題は、config.sysや autoexec.batをきちんと変更するのではなく、独自のものに置き換えてしまうものが多かったと言うところだ。また、変更しても環境変数の変更が適切でなかったりする場合もあった。これをインストールすると別のソフトが起動しなくなる、これをインストールすると違うものが起動するようになった、等。
 Windows3.1になって、さらに複雑になっていく。Win3.1は DLLやデバイスドライバーの塊のようになったので、DLLだとか VXDだとかが多く使われるようになった。MS-DOSの頃の名残で config.sysや autoexec.batに書き込んだりするものもあった。共通DLLや独自DLLを作り、それをシステムにインストールするようになった。そこからいろいろ問題が発生するようになった。
 DLLというのは便利なもので、再利用できるという点が長所である。各社独自の DLLを作り、自社ソフトと一緒にインストールするようになった。問題はというと、その DLLのファイル名規則がなかったことだ。ファイル名規則がなかったということは、同じような機能を持った DLLは、同じようなファイル名が付けられると言うことだ。それをインストール時にメーカー・バージョン確認もせずに上書きインストールしてしまう。A社が作った「X.DLL」と、B社が作った「X.DLL」は、名前が同じだが中身は全く違うと考えると、動かなくなったりおかしくなったりするのは理解できるだろう。
 システムディレクトリにコピーされると上書きされるかもしれないと言うことで、アプリケーション本体が入ったディレクトリに自社の DLLをコピーすることで、このようなことを回避しようとするメーカーもいた。DLLの検索が「実行ファイルのパス」→「PATHの通っているパス」という順序だからだ。だが、その頃の Windowsでは、システム自体に問題があった。何かというと、一度使われた DLLはシステムにキャッシュ(保存)され、他のアプリケーションが同じファイル名の DLLを使おうとした時に、キャッシュされた DLLを使ってしまう、ということだ。
 また、同じメーカーの同じ DLLにも問題が発生する。インストーラーの問題で、古いバージョンの DLLで上書きしてしまったり、別の言語の DLLで上書きしてしまったり。基本的に DLLは共通で使われるので上位互換性を持つように作るが、メーカーによっては新旧で互換性がなかったり。

 これが、今までのVBまで受け継がれてしまっている問題だ。
 VB標準のインストーラーであったディストリビューションウィザードの問題は、今までに起こった問題と同様の問題なのだ。
 また、Windows95以前と異なり、Windows95以降、OSのバージョンアップが頻繁になって、使われている DLLのバージョンもどんどん移り変わってきた。その弊害で、バージョンの違ういろいろなシステムがちまたにあふれかえってしまったのだ。
 ディストリビューションウィザードは、作ったプログラムで使用されている DLLや OCXをセットアップファイルとしてアーカイブする。
 この時にその時点でそのマシンにインストールされている DLLファイルが使われるという点が問題を引き起こす。
 もちろん、考えてみると、開発したマシンで動いていて、インストールしたマシンで動かないということを解決するためにも、各種ファイルをインストールしようとするという理由もわかる。が、新旧かなり違っているOSが散乱する中で、開発したマシンの共通ファイルをコピーしてしまうのは問題だ。
 さらに問題なのは、GUIを含めたOSという単位で使われる DLL等も含まれてしまうという点だ。例を挙げると、msvcrt.dllだ。MicrosoftVisualC++ランタイムという奴だ。これは Explorer.exeでも使用されているDLLで、バージョン不整合が起きるとOS起動しても Explorerが起動せずに何もできない、ということにもなってしまう。
 僕も CopyDirectoryで他人から指摘されるまで、msvcrt.dllなんかがセットアップファイルに含まれていることを知らなかった。以前作った配布パッケージでインストールすると、うちのマシンの msvcrt.dllがインストールされて、Windows98等が起動不可能になってしまっていた。

 このようなことが、VB=インストールするべきではない、という図式を作ってしまった原因であると思われる。
 Delphi等の Boland系の開発ツールでは、DLLを使わずに(すべて静的リンクで)作ることが基本になっている。Microsfotのツールとは逆で、DLLを使うといろいろ制約ができてしまうようだ。
 このような exe(実行ファイル)オンリーで作ることができる開発ツールを使っている人は、特に「VBは悪」だと信じているようだ。
 何か不安定になると、「そのマシンVBで作ったアプリインストールしてません?」の様に。
 たしかに、ディストリビューションウィザードやセットアップキットしか無い頃はそうだったかもしれない。
 だが、現在では VisualStudioInstallerを使うという選択肢が増えているのだ。Windows Installerである。
 このインストーラーを使っていると、今のところおかしくなる現象が発生したことはない。
 ただ、Windows95だとだめかもしれない等の問題は残るが、VBで作るのだから、そこら辺はあきらめるしかない。
 時代は進んでいく。Microsoftは、.NETへ移行しようとしているし、Windows95のサポートもなくなった。Windows9x/Meのサポートもなくなるだろう。IEもバージョン3も既に無くなり、ほとんどが5か6である。
 これからは、VB+VisualStudioInstallerでOK、万事問題なし、である。
 後は、プログラムを作る時に、IE等のバージョンには極力依存しないようにしようということかな。

 「VBは悪」と思っている人は、WindowsInstallerを使っているものをインストールすればいい。
 まあ、理屈はわかっていても嫌って人はどうしようもないけどね。