連載:VB研公開ゼミ議事録

第4回 Windows VistaでVB6アプリケーションは本当に使えるのか?

デジタルアドバンテージ 一色 政彦
2007/11/09
Page1 Page2

2. 各種コンポーネントはVista上でも正常に動作するのか?

 本稿では、「.DLL/.OCX/.EXEファイルなど」をまとめて「コンポーネント」と表現する。

株式会社デジタルアドバンテージ
@IT/Windows Server Insiderフォーラム編集長
小川 誉久

【小川】 基調講演でVB6のコンポーネントには、

  • VistaでサポートされVistaに含まれるコンポーネント(=Supported and Shipping。例:odbc32.dll、ole32.dllなど。以降、「サポートされる」コンポーネント)

  • Vistaでの動作テストはされたがVistaに含まれないコンポーネント(=Tested and Not Shipping。例:comdlg32.ocx、vb6jp.dllなど。以降、「サポートされない」コンポーネント)

の2つがある*1という説明がありましたが、なぜこのように対応が2種類に分かれているのでしょうか?

*1 詳細な一覧については「MSDN - Windows Vista における Visual Basic 6.0 のサポートについて」(日本語版)と「MSDN - Support Statement for Visual Basic 6.0 on Windows Vista」(英語版)を参照してほしい。後者(英語版)にのみ存在する情報も多いので、後者も参照されることを強くお勧めする。

【大野】 この理由は非常に単純で、コンポーネントの社会的な重要度により分けています。

【一色】 「サポートされる」コンポーネントはあらかじめVistaにインストールされているようですが、それらのコンポーネントをVB6アプリケーションが利用する際に注意すべき点はありますか?

【大野】 それらのコンポーネントの中には、Vista向けにプログラム・コードを書き換えているものがありますので、「サポートされる」に含まれるコンポーネントを利用する際には、Vistaに標準でインストールされているものを使わねばなりません。

【衣川】 つまり、Vistaで「サポートされる」コンポーネントは、「よそから持ってくるな」ということですね。

【八巻】 通常、Windowsファイル保護機能により「サポートされる」コンポーネントが上書きされることはないので安心です。かなりのレア・ケースだとは思いますが、アプリケーション・マニフェストによるサイド・バイ・サイドでそれらのコンポーネントを利用するようにしていた場合に限って注意が必要です。

【小川】 ところで、実際にアプリケーションやコンポーネントのVista対応を経験された方では、何か問題が発生したのでしょうか?

UACの詳細

【衣川】 アプリケーションをVista上でテストすると、何かしらの問題は出てきました。たいていはUAC(=ユーザー・アクセス制御)絡みの問題でしたが、それはたまたまそのアプリケーションがWin32 APIをほとんど使っていなかったからだと思います。Win32 APIを多用している場合は、かなりの修正が必要になるかもしれません。

こみゅぷらす(COMU+)
亀川 和史

【亀川】 Vistaでは、Win32 APIにいくつかの仕様変更が行われています。例えばWin32 APIでは、これまでANSI版Unicode版の2つのバージョンが提供されていましたが、Vistaで導入された一部のAPIではUnicode版しか用意されていません(例えばTaskDialog関数では、引数にUnicode用の「PCWSTR」型のみが指定できます)。このため、ANSI版のWin32 APIを利用していると、それが問題になることがあります。

【八巻】 グレープシティ製品などのサードパーティ・コンポーネントは、標準のコントロールにはない特別な機能が特徴ですので、それを実現するために、さまざまなWin32 APIを呼び出して実装しています。VistaのWin32 APIには互換性が十分とはいえない部分があり、この影響でかなり広範囲の修正が必要でした。

 例えば、グレープシティの中で一番問題となったのが、IME関連の処理を行うIMM32 APIです。少し技術的な話になりますが、Vistaでは(Windows XPのSP1以降から提供されている)「Text Services Framework」というテキスト入力サービスが標準で使用されており、これを解除できない仕様になっています。IMM32 APIを呼び出すと、旧来と同じ動作をするようにエミュレーションが働き、内部でText Services Frameworkを呼び出します。しかしそのエミュレーションの挙動がこれまでのIMM32 APIと完全に同じではないため、特別な対応が必要になりました。

 また、基本的にVB6のライブラリはUnicodeをサポートしていないので注意が必要です。ちなみに、一部のグレープシティのコンポーネントは、Unicode対応を行っています*2

*2 グレープシティが提供するVista対応に関する参考資料としては「GrapeCity - よく寄せられる質問 : Windows Vista上での動作について」(Windows Vista対応情報の[Q&A集]タブをクリック)がある。

【大野】 Text Services Frameworkの非互換問題については大変申し訳なく思っていますが、MSDNフォーラムでも同様の質問があって、現在、この問題の解消に向けて働きかけているところです。

【一色】 互換性のないWin32 APIを使っている場合、コード・レビューをしながら逐一チェックして問題の個所をつぶしていくしかないのでしょうか?

【大野】 基本的にはそうです。それ以外の手段としては、VB.NET(Visual Basic .NET)のマイグレーション・ウィザードを活用する方法が考えられます。このウィザードで警告が出ないように、元のVB6のソース・コードを直します。無駄にWin32 APIを使っている場所や、レジストリを使っている個所、何かトリッキーなコードがある場所などを、できるだけ普遍的なコードに置き換えることにより、Vistaでも問題の少ないVB6コードにしていくことが可能だと思います。

【一色】 参考までに、グレープシティでは、前記の非互換問題に対処するために、どのような修正を施したのでしょうか?

【八巻】 OSのバージョン(Vistaかどうか)をチェックする条件分岐によって、Win32 APIの互換性問題を回避するような特別なコードを追加しました。

3. VistaのUAC(ユーザー・アカウント制御)にはどう対応すべきか?

【小川】 では話題を変えまして、Vista最大の落とし穴である「UAC」への対応について議論したいと思います。

 VistaのUACは「ダイアログがたくさん出てきて面倒くさい」などの理由で「オフにしたい」という意見は多いですが、実際にオフにするとどんな問題が起こるのでしょうか?

【衣川】 オフにしたい気持ちは分からなくもないですが、そうしてしまうと、悪意のある予期しない攻撃にコンピュータをさらしてしまう可能性があるため、UACをオフにすることはお勧めできません。

グレープシティ株式会社
ツール事業部
テクニカルエバンジェリスト
八巻 雄哉

【八巻】 最初に「UACは単にダイアログが出るだけの機能ではない」ことを理解するのはとても重要です。「UAC=ダイアログが出ること」という印象が先行していますが、例えばキー・ロガー(=Windows OS上のキー入力をすべて捕捉してログとしてファイルなどに記録するプログラム)のような悪意のあるソフトウェアはUACがオンの状態では機能しなくなるので、そういう問題を防ぐためにもUACはオンにすべきなのです。

 また、UACをオフにして開発を行うと、開発環境とエンド・ユーザー環境でアプリケーションの挙動が異なってしまいます。例えば、「Program Files」フォルダへは管理者権限がないと書き込めませんが、権限がない状態で書き込むと、自動的に「各ユーザーの仮想フォルダ」にリダイレクトされます。一見うまく動いているように見えるので、その挙動の違いに気付かずに不具合の発見が遅れ、問題をより一層深刻にしてしまう可能性があります。

【小川】 なるほど。ですがシステム管理やITプロ的な観点から見ると、UACのようにクライアント・コンピュータとエンド・ユーザーの手にセキュリティ対応を依存してしまうのは、手法的な限界がある気がします。そもそも現実の企業では、すべてのコンピュータを全社一斉にVistaに置き換えることは難しく、部分的にVistaを導入していくことが多いと思います。Windows 2000も、XPも、Vistaもある。そうした混在環境の中で、一部のVistaマシンだけUACをオンにして、すべてのコンピュータのセキュリティ環境、ユーザビリティ、管理性をどうやって統一できるのか、課題は多いと思います。

【一色】 UACはエンド・ユーザーにとって非常に分かりにくい仕組みだと思っています。アプリケーションによっては管理者権限での実行を要求するダイアログが出ることがあります。例えば、(エンド・ユーザー向けではなく開発者向けですが)Visual Studio 2005 Service Pack 1では「Visual Studio 2005 SP1 を実行する場合、管理者権限が推奨されます」というダイアログが出ます。もちろんVistaに詳しい開発者やパワー・ユーザーならこのようなダイアログに適切に対応できますが、一般のエンド・ユーザーが見たら「これが何を示すのか」「どう対処するのが正しいのか」がよく分からないと思うのです。管理者権限で実行すべきかどうかは状況によりけりだと考えられるので、ダイアログがコンピュータの専門家でない一般ユーザーが使う業務アプリケーションで表示されたとして、その都度「管理者権限で実行すべきか、どうか」を逐一説明しなければならないというのは、ソフトウェア会社のサポートも大変だと思います。開発者ですらすんなりと理解できないものを、エンド・ユーザーに分かりやすく説明しなければならない状況が、これからの次世代コンピュータとしてふさわしい姿なのか、ベストなセキュリティ解決の方法なのか疑問です。

4. Vistaで導入されたJIS2004でVB6アプリケーションはどんな影響を受けるのか?

【小川】 最後に、日本語文字コードの話題に移ろうと思います。

 亀川さんのプレゼンテーションで、Vistaでは日本語文字コードがJIS90(Shift-JIS)からJIS2004(Unicode)へ変更され、新しい文字の追加や一部の文字で字形(=字体)の変更があったという説明がありました。それによって、「Windows XPや印刷などでの日本語表示が崩れる場合がある」ということですが、その点だけを見ると地味な問題に思えますが、実はもっと大きな問題に発展しかねない危険性をはらんでいるように感じています。例えば、データベースに正しく文字が格納できなくて、最近話題の「消えた年金問題」のような事態に陥る可能性も否定できません。実際のところ、起こり得るトラブルとしてはどのようなものが想定されるのでしょうか?

株式会社デジタルアドバンテージ
@IT/Insider.NETフォーラム副編集長
一色 政彦

【一色】 例えば、VistaとXPのコンピュータがあり、Vistaで入力した文字をいったんデータベースに格納して、それをXPで表示するという状況下では、どんな問題が考えられますか?

【亀川】 まだ大きなトラブルは現実に発生していないので、どんなトラブルが起こるかを明確に答えるのは現時点では難しいのですが、例えば文字コードを2byte固定で処理していた場合、そこにJIS2004で追加された4byteの文字が入ると、文字化けが発生する可能性があります。ひどい場合には、バッファ・オーバー・フローを起こして、任意のコードが実行されるなどのセキュリティ問題につながることも考えられます。

 実はデータベースも、JIS2004には完全に対応しきれていないので、適切な対応をしなければなりません。例えばSQL ServerではJIS2004の対応方法についてのドキュメント*3が出ていますので、それを参考にJIS2004の対応をする必要があります。

*3 「SQL Server の JIS2004 対応に関するガイドライン」や「SQL Server における JIS2004 対応について寄せられる質問と回答」など。

【八巻】 ほとんどのアプリケーションで、JIS2004で新しく追加された文字が、「何が何でも必要」ということは少ないと思います。従って多くの場合、JIS2004で追加された文字に関しては入力できないように対処するのが、当面の最も単純なJIS2004対応でしょう。

【衣川】 現実的にはVB6ではコントロールが対応していないので、JIS2004で追加された文字は入力できません。入力してもコントロール上で「???」と文字化けするので、実際に入力されたデータが確定してデータベースに入る危険性はかなり低いと思います。

 問題となるのは、.NETで作られたシステムからJIS2004の追加文字がデータベースに格納された場合、その文字をVB6アプリケーションで読み込むと問題が発生する可能性があります。.NETや他システムからの文字の入力が想定される場合は、VB6アプリケーションのJIS2004のテストが必要になると思います。例えば、画面表示が化けるぐらいならまだいいですが、「何か致命的なエラーが発生してアプリケーションがハングアップしてしまうことはないか」というような検証は必要です。

【小川】 分かりました。Vista対応には気を付けるべき点がたくさんあるのですね。本日は皆さんどうもありがとうございました。

 当日はパネラーだけでなく会場からも活発な質問や意見があり、大変に活況な基調講演&パネル・ディスカッションとなった。今後も、VB業務アプリケーション開発者を支援するVB研ゼミを続けていく計画である。この際、セッションのテーマや開催地、開催時間などは、読者からのご意見を参考にしながら決定する予定だ。ご意見あらば、@IT掲示板などにどしどし投稿していただきたい。End of Article

 

 INDEX
  VB研公開ゼミ議事録
  第4回 Windows VistaでVB6アプリケーションは本当に使えるのか?
    1.本当にVB6アプリケーションはVistaに対応できるのか?
  2.Vistaへ移行する方法や技術について

インデックス・ページヘ  「VB研公開ゼミ議事録」


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