特集
VB6アプリのWindows Vista対応(後編)

Vista上で動作するVB6アプリの作り方

codeseek 衣川 朋宏
2008/02/05
Page1 Page2 Page3

フォント問題

 VB6アプリを.EXEファイル単体で配布して実行した場合に、デフォルトのフォントの表示が文字化けしてしまうというのは、Windows NT時代からと同じである。これに対する対策も、アプリケーションをきちんと配布する、IDE上からフォントを変更しておくなど、対応策としての変化はない。

 下の画面が文字化けしてしまった例である。なお、表示されている内容は、GetVersionEx APIより取得したOSに関するバージョン情報である。上から順に、

  • スペーシングに全角スペースを使用したとき
  • スペーシングに半角スペースを使用したとき
  • スペーシングにタブ(vbTab)を使用したとき

の表示例である。

VB6アプリの文字化けの例
上から順に、スペーシングに「全角スペース」「半角スペース」「タブ(vbTab)」を使用したときの文字化けの例である。

 この状態で、文字化けしているラベルのフォントを表示させると、下の画面のようになる。

文字化けしている場合のフォント
この例では「MS Sans Serif」というフォントが使われているのが分かる。

 これ(この例では「MS Sans Serif」)を日本語フォントに変更すると、以下のように正しく表示される。これは「MS Pゴシック 16p」(pはポイントを表す)に設定した例である。

日本語フォントに変更した例
フォントを「MS Pゴシック 16p」に設定したときの例だ。

 Vistaから「メイリオ」という新しいフォントが追加されている。実は、ユーザーが自由にフォントを変更できるアプリの場合、これがまた問題となることがある。先ほどのアプリで、ラベルのフォントを「メイリオ 16p」に変更すると、以下のようになる。

メイリオに変更した例
フォントを「メイリオ 16p」に設定したときの例。

 フォントのサイズは同じなのに、フォームの下にラベルの表示がはみ出してしまった。また、最初の行のラベルが(右側の)途中で切れてしまい、その領域に「何らかのコントロールが存在する」のがエンド・ユーザーに見える(知られてしまう)状態となってしまった。これではエンド・ユーザーのアプリケーションに対する印象も悪くなってしまうだろう。

 このように、エンド・ユーザーにフォントの変更を許す場合、メイリオが選択されると表示が破綻(はたん)してしまわないかは、あらかじめ検証しておくべきだ。

OSバージョンの判定ロジック問題

 「2. VistaへのVB6アプリの導入」で触れたように、Vistaのメジャー・バージョン番号(Major Version)は“6”である。

 前述の「フォント問題」の項での画面は、明らかにVistaの画面なのに、OSTypeが「Windows 2000」と表示されている。実は、GetVersionEx APIを使用して取得した結果を一部誤って表示してしまっている例である。

 その原因は、プログラムで以下のように判断し、表示させているためだ。

……前略……
If intMajorVersion >= 5
  If intMinorVersion = 0 Then
    Me.lblOSType.Caption = “Windows 2000”
  Else
    Me.lblOSType.Caption = “Windows XP”
  End If
End If
……後略……
VB6によるOSバージョン判定のソース・コード(1)

 このように、単に表示がおかしくなるだけであれば、気まずい思いをしながら謝ればよいだけの話かもしれないが、上記のソース・コードが以下のようになっていた場合はどうだろう。

……前略……
If intMajorVersion = 5
  If intMinorVersion = 0 Then
    Me.lblOSType.Caption = “Windows 2000”
  Else
    Me.lblOSType.Caption = “Windows XP”
  End If
Else
  Msgbox(“Windows 2000以上のOSで実行してください。”)
  Unload Me
End If
……後略……
VB6によるOSバージョン判定のソース・コード(2)

 このコードの場合には、「Windows 2000以上のOSで実行してください。」というメッセージ・ボックスが表示されて、先に進めなくなってしまう。これを防ぐには、ソース・コードを開いて該当個所をすべて検索し、修正するしか対応方法は残念ながらない。

日本語問題−JIS2004とサロゲート文字

 Vista上でVB6/.NETを問わず問題となるのが、この日本語問題である。Vistaより「JIS2004」という新しい文字コードへの対応が行われ、いくつかの文字の字体が変更されたり、追加されたりしたことによって発生する問題である。この問題は一時期新聞紙上をにぎわせていたので、ご記憶の方もあると思う。

 有名なところでは、「東京都 飾区」の「」、「堂」の「」である(従来は「」や「」という字体が使われていた)。字体が違うため、人名や会社名を扱うアプリにおいて特に問題となる可能性がある。

 また、新たに追加された文字があることも重要である。例としては、「森 外」の「」、「楽部」の「」が挙げられる。これらの文字はIME上では、以下のように「機種依存文字」として注釈が付けられるため、入力時の判別は比較的容易である。

Vistaでの「機種依存文字」の入力
IME上では、「機種依存文字」として注釈が付けられるため、入力時の判別は比較的容易である。

 しかし、「プログラムとして機種依存文字を判別できるか?」となると別の話である。

 例えば、Vista上のメモ帳では、以下のように表示される。

Vista上のメモ帳での文字表示
機種依存文字を含んでいる6つの単語からなるテキスト・ファイルを開いている。

 同じテキスト・ファイルをXP上で表示させると、以下のようになってしまう。

「Vistaで入力した文字」のXP上のメモ帳での表示
上の3つはVistaでの表示とは字体が異なり、下の3つのうち2つは文字化けして正しく表示されていない。

 上の「飾区」「堂」「園」の3つは字体が違い、下の「る」「森 外」「楽部」の3つのうち2つは文字化けしていることにご注目いただきたい(具体的には、当該文字が「補助漢字」であるか「第三水準/第四水準」であるかによって、文字化けするかしないかが決まる)。同一アプリ上でXPとVista双方の字体を共存させるには、WPFアプリケーションを使用する必要がある。

 またVistaには、JIS2004とは別に、Unicodeのサロゲート文字の問題もある。「サロゲート文字とは何か?」の厳密な定義は割愛するが、簡単に説明すると、通常の「1文字2バイト」ではなく、「1文字4バイト」となってしまう文字のことである。例えば、上記の例の「る」である。文字としては「1」文字であるが、Len関数の結果としては「2」が返却されてしまう。

 いずれの場合も、幸か不幸かVB6の場合には画面上のコントロールが対応していないため、テキストボックスに入力したとしても、確定させた瞬間に文字化けとなる。いくらなんでも「これはまずい」とユーザーが気付きそうなものである。しかしながら、他システムから、DB(データベース)や中間ファイルを介して文字列を受け取り、それを編集して再び返却するような場合を考えてみると、サロゲート文字の問題性は明らかだ。

 例えば、Vista上で「る.txt」というファイルを作成し(中身は空でよい)、圧縮(zip形式)フォルダにすると、以下のダイアログが表示される。

サロゲート文字をファイル名に含むファイルをzip形式で圧縮にしようとした例

 さらに、アプリの起動パラメータとして使用してみる。これはパラメータとして「る」を渡した場合である。

サロゲート文字のパラメータ
これは起動パラメータとしてプログラムに渡された文字列やその文字数などを表示するサンプル・プログラムの実行画面である。2文字のはずが3文字と表示されている。また、2文字なので4バイトと思われるが6バイトと表示されている(バイト数は正しく表示されている)。

 文字列が化けたうえに、文字数やバイト数も実際の値とは異なっている(文字数やバイト数については、.NETアプリにおいても、同様の問題が発生する)。

 サロゲート文字の詳細については、「マイクロソフト サポート技術情報:Windows Vista で拡張された文字について」および「マイクロソフト Windows Vista JIS X 0213:2004 対応と新日本語フォント『メイリオ』について」よりダウンロード可能なホワイト・ペーパーを参照されたい。


 INDEX
  [特集]
  VB6アプリのWindows Vista対応(前編)
  VB6アプリをVistaで動かすための基礎知識
    1.VB6のサポート期限の問題
    2.VistaへのVB6アプリの導入
 
  VB6アプリのWindows Vista対応(後編)
  Vista上で動作するVB6アプリの作り方
    1.Vista上でのVB6アプリの運用・修正編(UAC関連)
  2.Vista上でのVB6アプリの運用・修正編(フォント関連)
    3.VB6の今後


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH