shin'nosuke さんのアレグロモデラート

アレグロモデラート(Allegro moderato)は、速さを示す演奏記号で「穏やかに速く」

2024 年における MSDEV98

小職は Visual Studio 6.0 のことを MSDEV98 と言ってしまう。理由は、1998 年に出た Microsoft の開発環境であるからとか、ディレクトリの名前やプロセスの名前が MSDEV.EXE だからなどいろいろあるのだが、サラリーマンのときのソフトウェア持ち出し表に MSDEV98 と書いてしまったら、それが Visual Studio 6.0 のことだとわからないと言われたことがあった。その節は失礼しました。

JavaCOBOL のようになってしまって久しいが、登場から四半世紀が到来する、この Visual Basic 6.0、Visual C++ 6.0 というものも、まだまだ現役で使われている。想定していた OS は、Windows 95、98、2000、Me あたりだが、Xp ではガシガシに使われて、Windows 10 でも、Microsoft は動くように気を使ってくれている気がする。じっさい、もう動いてもらわなくてもいいとは思うのだが、久しぶりに MSDEV98 を Windows 10 でさわったときのメモをまとめておきます。

ちなみに、学生時代に意図的に避けていた Visual Basic は、就職してから、よく使うようになり、プログラムを手に職とする者としてのスキルを勉強させてもらった。小職にとって、WindowsVisual Basic 6(以下、VB6)は、IT 業界で生きていく術を教えてもらったものであり、感謝の念が多くある。オッサンになって、あのころは不器用だけどかわいくてしょうがなかった Macintosh に手が届くようになっても、その Windows と過ごしてきた時間をくつがえすことはできないということが、小職が MaciPhone をメインにしない理由のひとつである。その意味でも、MSDEV98 は、記念碑的な IDE であるだろう。

インストール

  • VB の「ADO、RDSおよびOLE DBプロバイダ」と「リモートデータオブジェクトとコントロール」のチェックをはずす。

VB6開発環境をWindows 10にインストールする手順 – RIALAB.

起動

  • 初回起動時は管理者として実行する。そうしないと「オートメーションエラーです。OLE レジストリへのアクセスエラーです。」が出る。

yukieen.hatenablog.com

ホイール

  • ホイールでのスクロールができないので、VB6MouseWheel.EXE をインストールして設定する。

VB6MouseWheel.EXE はいまは配っていないようだが、むかし、調べたことがあったので、うちの共有ライブラリにあったのをインストールしました。
mozueのメモ - VB6 でマウスホイールを使用出来るようにする方法

作法

定数がとおい

このころの VB6 のルールはハンガリアンで名前の衝突を避けるために、変数も関数も名前が長く、変更の可能性があるリテラルは積極的に定数化しろ、だった。定数については、実行時はツールチップで値が出るのだが、編集時は 右クリック→定義 で追いかけるしかない。定数として値が定義してあればよいが、定数のように使用されていても、実はただのパブリック変数で、値が別のところで代入されていたときは、殺意を覚えた。
ちなみに、変更の可能性がある文字列を定数化しても、その定数の値が変わることはほとんどない、というのが、この 25 年でプログラマが学んだこと。C のような、物理メモリとのやりとりが多い、ネイティブコンパイラ言語ならともかく、中間コードのプログラム言語はマクロに近いので、文字列は直書きして一括置換で問題はない。どうせ、テストはやり直す。

配列とループを使いたがる

VB6 は DOS アプリケーションからの移植が多かったせいか、ファンクションキーを使わせるアプリが多い。ということで、ファンクションキーに対応するボタンを配列化して、イベントハンドラをひとつにまとめ、switch するというコードになる。GUI アプリケーションのイベント・ドリブンモデルは、当時はあまり受け入れられなかったみたいで、どうしても、ビジネスロジックはひとつにまとめたがる。(わりにタイマーのハンドラは、ハンドラからの関数でまとめることをせずにそのまま書く。)
そして、小職は、新人の頃にめちゃめちゃ怒られたが、ループの中に if や switch を書くというのは、コードの可読性と保守性が落ちるので、COBOL あがりの VB ベースのひとには大変嫌われた。ただ、C ではわりと普通のことであったので、エンジニアのスキルを見て、コードを書くようになりました。
ただし、プロのひとが書くコードというのは、誰でも読めて、難しいことが簡単に書いてあるコードであり、少ない手数で優雅に書いてあるコードではありません。

ヘッダコメントが長い

いまでこそ、Javadoc のおかげで、コメントのルールというのは一般化した。VB6 の時代は A Hotdocument という Javadoc みたいなものが VB6 の時代にはあって(まだあるみたい)そのルールに従っていればよいのだが、そういったルールがなく、アスタリスクとか★とか # で目立つコメントを書くことが正しいとされていた。ただ、VB6 自体が全体的に縦に長くなる言語であるとはいえ、コメントすらも縦に長いと、保守性に関わる。関数の始まりのあとに、縦に長いコメントがあると、この関数の名前がなんだったかがわからなくなる。(処理系によって、関数の定義内でないとコメントが使えないというのがあったはず。Oracle のストアドがそうだったような気がする。)コメントはブロックごとに手短に。

VB,VC++,C#,Java,Accessドキュメント自動生成ツール【A HotDocument】

MSComm コントロール

25 年ほどまえは、Windows でシリアル通信をするときは、C 言語で直接シリアルポートを開けて通信する方法から、Visual Basic の OLE コントロールによって通信させる方法に主流が変わってきた時期だと言える。IDE に入っている MSComm コントロールや、BOC の PDQComm などが挙げられる。
今回メンテナンスしたプログラムで、MSComm が使われていたところを、共有メモリでの通信に方式を変えたのだが、MSComm は使用していないということと、昔は使っていたということを明示したくて、コントロールの参照自体ははずさなかった。組み終わって、動かしてみると、環境によっては、通信時の応答に微妙な違いがあることに気がついた。
共有メモリアクセス時のミューテックス取得のタイムアウト時間が長いのか、とか、各種タイムアウトの調整を仕掛けていたが、こういうときは、パラメータチューニングというよりは、なにか別の理由があると経験上感じていたので、元のプログラムが出していたログを追う。すると、MSComm のレジストリ登録がうまくいっておらず、コントロールが使えないというエラーが出ていたのを見つけた。このせいで、通信のタイミングがずれてしまっていたもよう。対処は次の項へ。

ところで、PDQComm は Windows 10 では使えなくなったので除去しました。Spread 6 はまだ使えてます。

regsvr32 は SysWOW64 ディレクトリへ

MSComm は OCX なので、レジストリに登録する必要があるが、任意の場所で regsvr32 すると「コンポーネント '***' 、またはその依存関係のひとつが適切に登録されていません。ファイルが存在しないか、あるいは不正です。」と言われるのは、Windows 10 の 64 ビットで、32 ビットの OCX を登録するときは、C:\Windows\SysWOW64 に OCX を入れて、そのディレクトリにある regsvr32 を使って登録しないといけないらしい。SysWOW64 となっているが、32 ビットのライブラリを格納するディレクトリであるそう。

eijiman.com


なお、この共有ライブラリをレジストリという機構に依存していたことが、同じアプリでも、動くパソコンと動かないパソコンがあるという「レジストリヘル」という大問題になっていく。傍らで、こんな問題が発生するはずもない Java のシェアが広がっていくのをみて、Microsoft の開発環境は .NET Framework へ変わっていく。この流れがはじまったのが、25 年くらい前のことになるが、2024 年では、Java も、継承のあるオブジェクト指向が実は世界を救わなかったということがバレてしまったことと、Java が強要したエレガントな設計スタイルが面倒くさがられたことなどから、Java もレガシーなものということになってしまった。ただ、COBOLJava も VB6 もなくなることはないだろう。少なくとも、これらの歴史と、適切なコーディングや方式設計を知っていることは、先端の技術を使っていても、ぜったいに役に立つことであるはずだ。


ごきげんよう