Top > Programmingとか > VB / VB.NET > VB2四苦八苦

2003年06月01日

(6) VB2を複数起動してみる

6月に突入しましたが、相変わらずの人生ですさるですこんばんは。



VBでちょっと大きなシステムを作ろうとすると、どーしても機能ごとにEXEを分けなきゃならんわけです。
いえ別にこれはVBに限った話じゃありませんが。
Officeだって起動後におびただしい数のDLLを呼びまくっているわけですから、採用しているアーキテクチャが異なるだけで、どんなシステムもやってるこたぁそんなに変わんないんですね。

まぁ理由としては多人数でえいやっと作る際に個々人への作業の振り分けが楽だったり、動作検証がマルチでできるので作業期間(延べ人月ではなく)が短縮できたり、一度にメモリ展開される機能が少なくなるので体感的な速度が向上したりとけっこういいことあるじゃないって感じなんですが。
これが検証大詰めになったり事後メンテだったりとなると、割と少人数(大抵は一人)で全部のモジュールの面倒をみないばなんなくなったりもするわけです。割と。

そうなるとどうしてもモジュール同士の突き合わせとか参照とかで、複数のプロジェクトを立ち上げたいんですよね。
VB6なんかだとこれができるんです。プロジェクトファイルをダブルクリックするだけで、同時にいくつでも起動可能。
でも、VB2はこれができないんですよ。先に起動しておいたVB2にフォーカスが移るだけ(T_T)。

で、VB2の同時複数起動をなんとか可能にしてみようと。思ったわけです。



今さらですが、VB2は16ビットアプリケーションです。
これを32bits Windowsで動かすと、WOW32ってエミュレータみたいなやつが動いて、その中で16ビットアプリが動作するんですね。
じゃあこのWOW32をVB1個に対して一つずつ起動できればおっけーなんではないかと。
実際そーいうマルチな起動に対応するようにできてるみたいですし。

…と思ったんですが、どうも呼ばれるプログラム側から汎用サンクAPIとかいう16ビットだか32ビットだかよくわかんないAPIで直にコントロールしなきゃならないらしいんですよ。WOW32の複数起動って。
自作のプログラムならともかく、今回なんとかしたいのはMicrosoft謹製アプリケーションですからねぇ。

ってことでこれは却下。

じゃ、できあいの手法でなんとかごまかせないか。

そもそも二重起動を防止しているロジックは、たぶんVBのプログラムそのものの中に実装されているんじゃないか、と考えてみました。
同一かどうかの判断根拠はファイル名で行っているのではないかと。

じゃあ、VB.EXEをリネームしていっぱい用意しておけば、用意した数だけのVBが起動できるかも。

やってみました。

…できたよぅなできないよぅな。

なんか変な動作なんですよ。
「VB.EXE」→「VB2.EXE」でリネームして起動すると確かに両方起動するんですけどね。
「VB2.EXE」そのものは同時に2つ起動できるわけじゃありません。
最終的には.MAKファイルダブルクリックでいくつも起動できるよぅになりたいんですよねぇ。
VB2のプロジェクト選択機能は8.3形式でのファイル名表示ですし、640×480~800×600の画面解像度が当たり前だった時代の産物なのでダイアログが小さいんですよ。

「VB2.EXE」でも複数起動できないってことは、起動時のファイル名を二重起動の根拠に使ってるんでしょう。
てことで、起動するたんびに違うファイル名にしてやんないと二重チェックに引っかかるってことですね。

…あ。8.3形式?

じゃ、8.3形式を逸脱したファイル名に変更して起動したらどうでしょう。
VB2内部では8.3形式でしかファイル名を保持できないでしょうし、Windowsのプロセス管理が8.3形式に限定されないファイル名管理を行っていれば、VB2の二重起動チェックのロジックをだまくらかせるんではないかと。

試しに「コピー ~ VB.EXE」のファイル名のままで起動してみると。

おお、イケるよ多重起動!

らっきーってんで拡張子の関連づけも「コピー ~ VB.EXE」に付け替えて。
実際に仕事でイジっているデカいプロジェクトを次々に起動!

IMTEXT.VBXのロードに失敗しました。

しまったぁ、VBXがっ!



…思い出しました。
VB2の頃のVBX(プログラムパーツ)って、多重起動できないものがいっぱいあったんです。

VB4になった時に、OCXが多重起動できるんで感動していたんでした。
でもCrystalReportsがシングルスレッドアパートメントタイプのOCXで使えねぇっ!とか怒っていたんでした。

ここまでやってよぅやっと思い出すとは…(T-T)

結論。

VB2自体は多重起動できそぅな感じだが、
VBXを使用しているプロジェクトはほぼ不可能。

…ダメでした…

2003年05月28日

(5) Visual Basic増強作戦

なんだかVB2で新しいプログラムを作ることになりそぅなさるですこんばんは。
世はもぅVB.NETが2003になるって勢いだというのに、私のリアルはVB2ですかそーですか。これも運命ですか。っていぅほどのことですか。

ちなみに。
VB.NETってVB2の頃から見るともーれつに言語仕様が変わってしまいましたが、いちおぅVBの系譜の中ではVer.7に位置付きます。
最近VS.NETが新バージョンとなり、「2003」と呼称されるようになったんですが。それに対して従来のVS.NETは「2002」と。
でもこのバージョンアップ、その元となる.NET Frameworkは1.0→1.1のマイナーバージョンアップなんですよね。VS.NETの今回のバージョンアップは.NET Frameworkのバージョンアップに呼応するものですから、こちらもマイナーバージョンアップとして捉えるべきなんでしょう。
VS.NETのIDEのバージョン情報では、確かに「Microsoft Development Environment 2003 Version 7.1.3091」って書いてありますしね。



それはともかくVB2。ヘルプを再作成しているのは先日本項でお話ししたとおり。

その際、「(Visual Basic増強作戦を)ど、どなたかお持ちではありませんか…」と書いたところ、ほんとに提供していただけました。
びっくり。言ってみるもんだなぁ。改めてご提供者の方、ありがとうございました。

で。ひととおり読み返してみました。



VB増強作戦が活動していたのは、1997~1998年の約1年3ヶ月。

当時のVB使いの平均的なスキルの低さといったらそりゃぁもぅ(もちろん私も含め)。
何ができるのかできないのかもわからず、右往左往していたもんです。

ニュースグループ(NG)やメーリングリスト(ML)、あちこちに立ち上がり始めた掲示板(BBS)にすがって質問と回答が繰り返されたり。
もちろん見知らぬ人との文章による唐突なやりとりへの常識など浸透しておらず、何かと感情的な衝突も繰り返し。

このへんの啓蒙に大きく貢献したのがPCDN。酒井法雄氏を代表としたユーザーグループ。
そこのNGで行われるやりとりは単なるTipsの応酬ではなく、設計思想から事後メンテナンスまでの視野を含んだまっとぅなプログラムを作るにはというポリシーに貫かれたものでした。

そのムーブメントの中で繰り返し言われたのが、

まずVB増強作戦を読め。
とにかく読め。
いーから読め。

ほんとに質・量共にすごいんですよ。

語り口にもサンプルコードにも、いっさいけれんみがありません。
小手先でしのぐのではなく、WindowsOSとVBの仕様を正しく知って素直にコーディングしてあるんです。
また、基本的なポイントをほとんどカバーするだけの情報量。

個々のTipsももちろんありがたく流用させていただきましたが、一番学んだのは、

VBを知るには何を学ぶべきか

といぅことでした。
PCDNでくりかえし言われた「msdnを読め」「Windowsを知れ」の実践例。
正当に組んだコーディングの美しさとタフさ。

私のプログラム作成のポリシーの一部はこの時期に形成されました。
そして、その最大のファクターのひとつはまちがいなくこのVB増強作戦です。



あの時の盛り上がりの中でリアルタイムに学べた私は僥倖だったかもしれません。
当時私自身がプログラマに転職したばかり、といぅ個人的な事情も強い動機としてありましたしね。

今これからVBの腕を磨こうとする人は、大変かもしれません。
周囲からパワーをもらうこともできず、ある意味時代遅れの知識を身につけていかなければならないんですから。
今初めてVB増強作戦を読む方には、ショボいTips集にしか見えないのかも。

今始めるんなら、VB.NETですか。C#.NETですか。
なんかあまりアツさを感じないんですけど。どこ見ても。

…だいじょぶですか?

2003年05月26日

(4) ヘルプを何とかしてみるII

最近改めてHTMLとかにハマっているさるべーじですこんばんは。

先日VB2からHTMLヘルプを起動できないかと書いてみたわけですが、実はあれ、結論書くのを忘れて中途半端な文章のまま公開してしまっていました。

でも誰にもツッコまれず。

そんな技術的にどぅのこぅのとは別に、地味に地道にHTMLヘルプそのものも作っているわけです。
なんだかこれが無意味に整理好きな私にツボで。
今まで使いにくかったヘルプを再編集しながらどんどんHTMLヘルプへ移管しています。た、楽しー。 < 変?

VB初心者友の会といぅ老舗のVBプログラミングテクニック掲示板のひと頃のQ&Aをヘルプ化したvbhelp980219.zipってアーカイブがありまして。
VB2~5くらいの時期のものだと思うんですけどね。今でも色あせないTipsがびっしり。
まぁあちこちにちりばめられている製品や企業、参照を促すURLなんかはさすがに状況がいろいろ変わってきてしまっていますが。
そのへん現在の状況を調べながら整理していくのもまた楽しいわけです。

もっともこのQ&Aの頃は、伝説(?)のVB増強作戦といぅサイトのコンテンツが大前提になっていたわけで。作者の玉城さんの就職と共に実質的な閉鎖→後日完全閉鎖。
VBのひととおりの使用法とテクニックはほとんどここで網羅されていました。のでそこを参照できないと、VB初心者友の会Helpも価値半減なんですけどね。

実質閉鎖時にコンテンツ丸ごとアーカイブにしてダウンロード可能にしてくださっていたはずなんですけれども。私もしっかり永久保存したはずなんですけれども。永久保存しすぎてどこにしまったのかどーしても思い出せません(T-T)。

ど、どなたかお持ちではありませんか…m(_ _)m。

2003年05月12日

(3) ヘルプを何とかしてみる

さるべーじです、ほぼにちは

いゃぁMetroid Prime/Fusionからこっち、みょーにほぼ日刊イトイ新聞に改めてハマり直しています。
なんだかね。いいんですよ。いろんな人の日々の気持ちがぎゅっと詰まっているよぅな。
笑ったり、泣いたり、どせいさんだったりしながら。



さて、VB2のヘルプなんですが。

やっぱ使いにくいんですよ。あまり構成が練られていないよぅな気もするんですが、それはちょいと置いておいても。

VB6とmsdnヘルプに慣れちゃった我が身としては、コンテンツが左側に一覧で表示されていないと何ともつらい。
WinHelp3.1の仕様なので、検索ダイアログも独自方式で、WinNT系(NT4/2000/XP)で作業しても全文検索ができないのもつらい。
せっかくヘルプで目的の単語を見つけても、カット&ペーストできないのでいちいち手入力し直さなければならないのもいちいちつらい。

ので、いっそヘルプファイルを作り直してしまおぅかと。



となると、真っ先に気になるのが状況依存機能への対応。

ご存じの通り、VBとかはF1を押すとヘルプが表示されるわけですが。
F1を押した時に、どのウィンドウのどの部分にフォーカスが当たっているかによって、表示されるページが違うんですよね。
例えばコードウィンドウの「While」にIビームが当たっている時にF1を押すと、「While...Wendステートメント」のページがどん、と。

なんぼ自分好みにヘルプファイルを作り直せたとしても、この状況依存機能がなくなっちゃうとそれはそれでいかにもつらい。わけです。

ので、まずはここらへんから。



WinXPの場合、アプリケーションとして起動されているプログラムのEXE名がわかるような仕掛けがあります。

VB2起動→F1でヘルプ起動。
とすると、当然画面にVB2ヘルプが表示されるわけですが。
ここでタスクバー右クリック→[タスクマネージャ(K)]を選択するか、または[Ctrl]+[Alt]+[Del]を一気に押すかすると、タスクマネージャが表示されるわけです。

ここでVB2ヘルプは[アプリケーション]タブで「Visual Basic Help」として表示されています。
この行を右クリック→[プロセスの表示(G)]を選択すると、[プロセス]タブの「winhelp.exe」にフォーカスが移るんですね。これで、VB2ヘルプの実行本体がwinhelp.exeであることがわかります。vb2.hlpはこのwinhelp.exeが使用するデータファイルなわけですね。

このwinhelp.exeはWinXPが16ビットアプリケーションの動作互換を図るためにシステムファイルとしてWindowsフォルダ(通常はC:\Windows)に存在しています。
他に16bitsアプリケーションを使用していないのであれば、ここを同名の別のプログラムに置き換えてしまえばいいのではないかと。思って。やってみたわけですが。

…だめだぁ。WinXPのシステムファイル保護機能が働いて、元のプログラムに戻ってしまう。
不本意なプログラムの改竄(コンピュータウィルスとかのせいで)の場合には非常に安心な機能なんですが、こーいぅ時には困ってしまいますね。

2003年03月19日

(2) コードウィンドウのフォントを小さくしてみる

ひさびさのVB2で、プログラムをフッ飛ばしまくっているさるですこんばんは。

いぇもぅほんとに、ちょっと大きなプログラムをどぅこぅしよぅと思ったら、リソース不足やらメモリリークやらでばんばん吹っ飛ぶんですよVB2&Win95。
よくもまぁこんな環境で学んできたもんだと若かりし頃の自分にびっくり。

そー考えてみると、WindowsもVB IDEも、堅牢強固に進化してきたんですねぇ。
VB6でふつーに使ってて落ちるなんて考えませんもん。

使い勝手も、VB5~6を知ってしまぅとVB2の貧弱さに泣く思い。
いぇ、実は.NET IDEの使い勝手がむちゃくちゃいいので、最近はVB6でもちょっとまどろっこしかったり。
やっぱコンパイル&ゴーな状況はいいっす。文法エラーを一括チェック→一括修正ですもんねぇ。

VB2なんて右クリックのコンテキストメニューもありませんし(Win3.1用のデザインですので当たり前なんですが)、ステップアウトもないのでトレースすると細かいところへ入っていって出てこれないなんて賽の河原なデバッギング(T-T)とひょー。



さて今回のお題目。

前回、

どなたか、VB2のコードウィンドウの
フォント種/サイズを変更する方法を
ご存じないでしょうか。

などと困ってみたりしたんですが、誰も助けてはくれず。
まぁかなりなレアな困りごとでしたので、そぅそぅ救いの手がさくっと来るとも期待はしておりませんでしたが。

ので、自力で何とかしようとがんばってみました。

まず最初に、VB.INIの[Visual Basic]-[DeffontStyle]をいじってみました。

これはもともとVB2付属の「VBフォントユーティリティ」って奴で、VFONTってオリジナルの小さめフォントに差し替えた時に記述されるんですが。
Windows95ではVFONTは使えないので、VBフォントユーティリティも無用な長物なんですよね。

でも。VB.INIを直接いじってやって

DeffontStyle=MS ゴシック,9

とかしてやると。
プロパティウィンドウやプロジェクトウィンドウは指定通りのフォント種/サイズになってくれるんですよ。
…コードウィンドウは無理ですが。

VB.EXEのバイナリを調べてみたりレジストリを総ざらえしてみたりもしたんですが、どーにもコードウィンドウのフォントを指定している個所を見つけることができません。16ビットアプリにレジストリは関係ないんですが。まぁ一応。

ので、今度はVBの外側からむりやりコードウィンドウを乗っ取ってみました。

乗っ取るってもそんな恐ろしげなもんではなく。
CreateFontIndirectでフォントを作成して、それをコードウィンドウにWM_SETFONTメッセージぶん投げるだけなんですけど。

…変わりません。

Win95用32ビットアプリならこれでけっこぅ効くんですけどね。
やっぱ16ビットアプリに32ビットAPIをぶん投げるのは無理があるかも。

でもなんかあきらめられないので、ぶん投げ先をプロパティウィンドウにしてみました。
…プロパティウィンドウのフォントまでコードウィンドウとおんなじになってしまいました。
大失敗。

でもなんで?

フォントが変わらないならまだしも、なんでわざわざコードウィンドウと同じフォントに変わっちゃうんでしょ???

…思い出した。
Win95ってリソースが不足してフォント構造を保持できなくなってくると、息も絶え絶えにシステムフォントでエラーメッセージとか出すんだった。
いきなりメッセージボックスのフォントが大きくなったりすると、もーリソースが限界ってんでトラブる前にどんどん再起動かけながら作業していた頃を思い出しました。

ってことは、コードウィンドウのフォントって、システムフォント

ってことは、システムフォントを差し替えてやればコードウィンドウのフォントも変わるわけ?

インターネットで検索してみたら、山ほどありました。Win95のシステムフォントを小さくする方法。
mini.cabからj13*.fonを抜き出してFontsフォルダに突っ込んでから、レジストリのすべてのfonts.fon、fixedfon.fon、oemfont.fonをj13sys.fon、j13fix.fon、j13oem.fonに書き換えて再起動してやればおっけーっ!

やったぁ。

なんか画面の解像度とか色数を変更するとシステムフォントが初期値に戻っちゃうみたいなので、気軽に再設定できるよぅに、キーの修正個所をエクスポートしてRegファイルにしておきました。
これでなんべん初期値にもどってもダブルクリック&再起動でコードウィンドウのフォントは小さいまんま。完璧です。

ちなみのこの手法、WindowsXP&VB2でも効きました。
ちょっとWin95より書き換えるキーが多かったですけれども。
でも、こちらは画面のプロパティを変更してもシステムフォントが初期値に戻らないので、ある意味便利かも。

ただし。WinXPにはj13*.fonが付属していません。
ものはためし、ってんで手持ちのWin95に付属していた奴を突っ込んだらうまくいっちゃいましたけれども。でもこれ、使用許諾違反だよなぁ。
大手を振ってこぅしたまぇとかイバれた方法じゃありません。
WinXPのシステムCD-ROMの中もひととおりひっくり返してみましたが、j13*.fonに相当するサイズのフォントは付属していないっぽいです。

WinXPでもVB2やってみたいんだけどなぁ。なんかうまい手はありませんかね。

2003年03月05日

(1) WindowsXPで動かしてみる

今どきVB「2」マスターのさるですこんばんは。

私の生業はプログラマとかSEとかなんかそのへんなんですが、一応この手の仕事ってのは守秘義務があるわけです。お医者さんほどではないにしろ。
個人情報の保護やら知的所有権ビジネスがどーたら言われている昨今、どんどんウルサくなってきています。

ので。お話ししても差し支えない技術的な部分(著作権とか特許とかに関係ない部分)をときおりネタにしてみたりもしているわけですが。
やはり仕事としておもしろいのは、「こーいぅ状況なのでこんな技を繰り出さなければならなかった」とかのあたりなんですね。
でも、やっぱ仕事の状況までカタってしまうのはまずいです。レアな案件もありますので、うかつにしゃべったらどこの何を作ったのかわかる方にはもろばれする可能性もありますので。



で。VB2です。

これ、正式にはVisual Basic Ver2.0といいまして、Windows3.0/3.1用に1993年に発売された初のWindows用簡単言語なわけです。
Ver1.0は私見たことがありません。話ではどぅも、Microsoft BASIC/QuickBASICの流れを組むMS-DOS用開発環境だったよぅなんですが。

Windowsプログラム用開発言語としてはそれより少し前にMicrosoft C 7.0 & Windows SDKってのがありましたが。これ、開発作業がやたらめんどかったりくそ重かったり難しかったりでなかなか使える人は少なかったわけです。

そこへRADツール(直感的に使える簡単プログラム開発ツール、とでも思ってください)としての位置付けで出ちゃったんだものVB2。
もーぅみなさん飛びつきまくりですよ。
特に基幹系や業務系のシステムなんかはテクニックの高度さよりも入出力の確実さがモノを言う世界ですから、VB2製の経理システムやらなんとか管理システムとかがもーわさわさ。

Windows95→NTへと移り変わっていく中でこれらのシステムも32ビット化移植とか、ひと頃技術系のメーリングリストや掲示板でずいぶんアツく語られたりしたもんですが。
一方で、「今正しく動いているモノをわざわざ作り直してデグる(新たなバグを作り込む)必要なんかない」、と考える人たちもいたんですね。で、Win95でもNTでもVB2製の16ビットシステムのまま年月に耐えてきたシステムもたくさんあるわけです。

さすがにDOS用のシステムはそぅも言っていられなくなってきていますが(特に当時超メジャーだったNECの98系で動作するものは…いいかげんハードが入手不可能になってきましたし)。
しかし、VB2はまだまだ現行のマシンで動作します。なかなか苦しいですけど。

また基幹系なんかはねぇ。10年くらいで全面的に作り直さなければならないほどルールが変わるわけでもありませんし。税金とか帳票様式とか各種法律等で定められたりしているあたりはこまめに修正入れてやらなければなりませんが、原則すーっと使えるもんであることが多いです。

てことで、今回の私の仕事はそんな感じです。
なんせVB2とか使える人も少なくなってきちゃいましたしね。Oracleへの16ビット接続はOO4OではなくGlueを使ったりするんですけど、そこらへんも知っている人はすでに少数派。Btrieve知ってる人なんて、もぅ40~50代なんではないでしょうか。



とか言いつつ、さすがに今どきWin3.1を納品するわけにもいかないので、なんとかWin95/98あたりで妥協してみます。ドライバやらなんやらが入手不可能になってきていて、これももぅ半分死にかけてるんですけどね…。

でもMax2GB(Win95は確かそれ以上を認識しなかったはず)はキツいのよ。

ので、昔のオリジナルFDを引っ張り出してきて、自宅のWinXPにインストールしてみました。

…ちゃんと動くし。しかもむちゃっ速。

もちろんWin3.1の裏のDOSにむりやり降りるよぅなVBX(OCX - VBのパーツ - の16ビット版)はうまく動きませんし、APIも16ビット用のものしか使えないので、どこまでまともなプログラムを組めるかどぅかはあれですが。
でも、動作はします。すげぇ。

ちなみに、フォントが固定で妙にでかいです。VB.iniを直変えしてやればプロパティウィンドウのフォントなんかは置き換えられるんですけど。肝心のコードウィンドウがSystem10ポ(てゅうかFixedSys14ポ?)でどーしても変わりません。
VB2はコマンドの複数行記述に対応していないので、どんなに記述が長くなっても横1行に書かなきゃなんないんですよね…プロシージャ単位で別ページになってますし。

どなたか、VB2のコードウィンドウのフォント種/サイズを変更する方法をご存じないでしょうか。これはこの際反則技でもけっこぅです。

ほんっと、つらいんですよこれ。本気で「移植しましょう!」と提案したくなるくらいの勢いで。くすん。