VB6 ランタイム一覧表

コチラにあるVB6ランタイム一覧表ですが、時々地味に更新されるので実に油断がなりません。
先にWindows Server 2008 対応が追記されましたが、密かにサポート対象の一覧も更新されています。
対象ファイル一覧のグルーピングが(判りやすく)変更され、
・Supported Runtime Files – Shipping in the OS
(サポート対象 – OSの一部として出荷)
・Supported Runtime Files – Extended Files to Distribute with your application
(サポート対象 – アプリケーションとともに配布される拡張ファイル)
・Unsupported Runtime Files
(サポート外)
となっています。
二つ目のヤツは、要するに「コレがないとフツーに動かんだろ」というような、”comdlg32.ocx”とかが入っています。
さらに、
・Unsupported, But Supported and Compatible Updates or Upgrades are Available
(サポート外だけど、ビミョーにサポートされる。)
ってのがあり、”dao350.dll”とか”mdac_typ.exe “が入っています。
で、ローカライズされたバイナリは、相変わらず”Supported not Shipped”という扱いです。
#ってか、和訳してよ…事情はわかるけど…

【続】VB6ランタイム on Windows Server 2008 

コチラで取り上げた、VB6ランタイムの Windows Server 2008 対応ですが、公式リリースが出ていました。
コチラ- MSDN – Visual Basic 6.0 Resource Center – Support Statement for Visual Basic 6.0 on Windows?Vista?and Windows?Server 2008 ? です。
まだ英語のみのようですが、ざっと見た感じでは、Vista 対応と同じような感じです。64bitも一応対応しています。
VBScript はこのステートメントには従いませんが、Vista / 2008 と同梱-つまりOSと同期間のサポートを受けられるとのことです。
VBA内のVB6ランタイムについても、サポートされると記述されています。
ま、とにかく、公式発表が出たところで、一安心といったところでしょうか-とっくに発表されていたのか見つけられなかったのかはともかく

VB6ランタイム on Windows Server 2008

VB6ランタイム、Vista上では同梱されているので、Vistaのサポート終了まで、同様にサポートされます。
じゃぁ Windows Server 2008 は?
米国発のblogを読んでいたら、「2008をセットアップしたら、VB6ランタイムが入ってたよー」という記事を見つけました。
つまり、同梱されていると。ってことは、Vistaの場合と同様に、Windows Server 2008 のサポート終了まで、VB6ランタイムがサポートされると。で、メインストリーム5年、延長5年で、〆て10年-2018年まで!!
っていうか、VB6ランタイムのサポート期間、歴代MS製品の中でも最長の部類に入ると思うのですが…

特殊フォルダを決め打ちしないために

データを保存するためにどこかにファイルを出力します。
この時ウッカリ”C:¥Document and Settings¥Administrator¥My Documents¥”とか”C:¥WINDOWS¥System32¥”とかやると、後で痛い目に遭えます。
前者はVistaで死ねますし、後者はWindows2000で死ねます。
それ以前に、Cドライブ以外にインストールされた時点で即死です。
そういうモノは、然るべき当局筋にオウカガイを立てるのが筋ってもんです。
で、.NET環境なら話は簡単です。
System.Environment.GetFolderPath然るべき引数で呼んであげればよいだけですから。
しかし、VB6/VBAの場合には、Scripting.FileSystemObject の GetSpecialFolder メソッドで、引数は
・0 : WindowsFolder
・1 : SystemFolder
・2 : TemporaryFolder
の3つだけです。.NETのEnvironment.SpecialFolder列挙体に比べると、情けないぐらいに貧弱です。
ではどうするかと言うと、昔ながらのAPIコールという手が使えます。SHGetFolderPath を使用します。
説明はコチラ:MSDN – SHGetFolderPath Functionです。
引数であるCSIDLの説明はコチラ:MSDN – CSIDLです。
注)全てのCSIDLが使用できるわけではないようです。詳しくはSHGetFolderPathの説明(英文)をご覧ください。
両方とも英語で若干腰が引けるのが難点です。
KBには機械翻訳の解説資料があります。
そのものズバリ
Visual Basic からの SHGetFolderPath 関数の使用方法 (文書番号:252652)です。
KBの方にも書いてありますが、Windows2000以前のOSにはSHFolder.dllの再配布が必要なのでご注意ください。

Vista 上の VB6 – OCX編

Vista上でもVB6のアプリは動きます。
MicrosoftのVBチームも、

Visual Basic チームは、Visual Basic 6.0 アプリケーションが Windows® Vista™ でも “そのまま” 動作する互換性を提供することを表明します。」
原文:The Visual Basic team is committed to “It Just Works” compatibility for Visual Basic 6.0 applications on Windows® Vista™.

とコミットしているので、動きます。
日本語:Windows® Vista™ における Visual Basic 6.0 のサポートについて
英語:
Support Statement for Visual Basic 6.0 on Windows® Vista™
ただ、イロイロとごたごたする部分はあります。
例えばOCXです。
上に挙げた日本語ページで「Windows Vista に同梱されるファイル」に載っていないOCX、英語ページでは「Tested, But Not Shipping in Vista」というリストもありますが、よくお世話になるコモンダイアログとかFlexGridとかが「同梱されるファイル」上に見当たりません。
で、それらのOCXを使用したVB6アプリは、素の状態では当然動かないわけです。
なので、インストーラーで突っ込んでやる必要があります。
ただし、サポートライフサイクルには注意が必要なようです。
※手動でregsvr32をたたいたら、レジストリへの書き込みが出来ないといって怒られました。どうやらVistaでセキュリティが厳しくなったせいでしょうか。

Format 関数と Format$ 関数

Format関数 と Format$関数。
やることは殆ど同じです。
では相違点は何でしょう?
Format関数はVariantを返却し、
Format$関数はStringを返却します。
代入先がMsgBoxだったりstring変数だったりするときは全く同じですが、ウッカリ変なことをたくらむと、非常に追いにくいバグの元になったりします。
できれば、明示的に”$”をつけてあげたほうが幸せでしょう。
他の文字列関係の関数でも同じです。
なお、VB.NETでは、返値はStringとなっておりますので、その混乱は無用な模様です。

VB6での「端数処理」の復習

VB6において、丸め関数は”INT”,”FIX”,”ROUND”があります。
このうち、”ROUND”は「最も近い偶数に丸める」という四捨五入であり、一般的なものとは違います(よく嵌るワナ)。
さらに、”INT”と”FIX”はともに「切捨て」です。
“INT”と”FIX”の違いは、負数時に現れます。
INT:負数時には絶対値の大きい側に寄せられる
FIX:負数時には絶対値の小さい側に寄せられる
これらの性質を理解したうえで、自作関数として「四捨五入」や「切り上げ」を作成するのがよいでしょう。
また、型変換関数(CIntとか)や暗黙の型変換は、内部で”Round”しているようです。したがって、期待する四捨五入が得られないことが多いです。
とにかくやってはいけないのは…
・盲目的に型変換/Roundを信じること
・さらに、型変換元/Roundの引数に、強引に”0.0001″なんて加算してみること
ここをしっかり理解しておかないと、いくら精度のよいデータ型を使ったところで無意味になってしまいます。
ちゃんと理解して使いましょう。
(実験結果を載せようと思ったけど、すごい行数になったので止めました…)

ADOを経由してADSI-LDAPへ

.NET ならば、System.DirectoryServices を使用すれば良い話です。
そちらについては、MSDNライブラリ:System.DirectoryServices 名前空間 をご覧下さい。
VB6では当然使えません。
ではどうするかというと、ADOを使ってアクセスします。
その方法については、Microsoft サポートオンライン KB187529 – ADO を使用して、ADSI LDAP プロバイダ経由でオブジェクトにアクセスする方法 に記述されています。
しかし、このKBで公開されているサンプルソースには若干宜しくない部分があります
理由:
Recordset.Field.Value の中に「配列」が入ってくる場合があるのです。なので、単純にスカラーと思って扱うと痛い目にあいます。
実際に使用する際には、きちんとIsArrayで確認してから使いましょう。

バイナリファイルを読む

なんからかの理由でバイナリファイルを読み込む必要があるとき、いつものように使ってしまいそうになるのが、 TextStream Object。
TextStream はその名のとおり、Text File 用です。バイナリに使用してはいけません。
バイナリファイルを読むには…
1.basp21(http://www.hi-ho.ne.jp/~babaq/basp21.html) より、BinaryRead を使う。
2.ADO.Stream Object を使う。詳しくはMSDN-ADODB.Stream オブジェクトを使用して ASP 経由でバイナリ ファイルをブラウザに送信する方法をご覧下さい。
の2つがあります。目的、環境などに合わせて選択してください。
(他にもあるかとは思いますが、私が常用する手段ということで。)