特集
Visual Studio .NETベータ2 オーバービュー

5.Visual C++でのアプリケーション作成の変化
―― VC++プログラマから見たVS .NET ――

槙邑 恭介
2001/09/06

改訂前の記事はこちら

Page1 Page2 Page3 Page4 Page5 Page6 Page7 Page8

 これまでVC++を利用してきたプログラマにとっては、今までのプログラミング環境から、.NETプラットフォームに対応したプログラミング環境への移行にあたり、どの程度のギャップがあるのかが気になるところだろう。ベータ2を試用した限りでは、VS .NETの中で従来のコードがそのまま利用できるのはVC++だけであった。VC++では、これまでのMFCベースのアプリケーションはそのままビルドできるし、MFCもこれまでどおりサポートされている(バージョンは7.0となっている)。ATLも拡張されている。ただしVS .NETでは、C++でもCLR上で動作するマネージド・コードが生成できるようになっているので、Managed C++によるアプリケーションを作成する場合は、今までのやり方とは、記述方法がずいぶん変わっている(マネージド・コードを生成するC++をManaged C++と呼んでいる)。

 Managed C++ではMFCやATLは使用せず、CLRで提供されるクラス・ライブラリを利用することになる。そしてそのクラス・ライブラリを利用するためのディレクティブやキーワードが追加されている。そのためC++を使ってローカル・アプリケーションを作成する場合は、ネイティブなEXEを作成するか、Managed C++を使用してCLR上で動作するアプリケーションを作成するかでソースの書き方が若干異なるので、どちらの実行形式をとるか、事前の判断が必要となる。

VC++でのマネージド・コードの記述(Managed C++)

 VC++でマネージド・コードを記述する際には、利用するクラス・ライブラリを「#using」ディレクティブを用いて指定する(このディレクティブの指定方法はC#でも同様である)。さらにクラスや構造体の宣言の際に、ガーベジ・コレクションの有無(__gc)やインターフェイスの指定(__interface)のためのキーワードを付加する。

 このような指定によってVC++で記述したコードがCLR上で正しく動作するようになる。このようにすると、C#やVBと同様に、XML WebサービスやASP .NETから参照するコンポーネントの作成が可能になる。当然ながらコンパイル時にはネイティブEXEではなく、CLR上で動作するコードを生成するスイッチを指定しておく必要がある。これはプロジェクト生成時に[Managed C++ アプリケーション]を選択することで、利用目的に応じたプロジェクトとスケルトンが作成されるので、これをベースにコードを記述してゆけばよい。

■MFC 7.0の変更点
 VC++の標準ライブラリでは、2038年問題(通常では日付情報を、1970年からの秒数を32bitの整数値で表現している。そのため、2038年で32bit値がオーバーフローする)に対処するため、日付関係のライブラりに64bit値を用いる関数が追加されている。また、MFC 7.0でも同様に、CTime、CTimeSpanクラスなどで64bitに対応するメンバ関数が追加されている。MFCではさらに、HTMLの編集が可能なCHtmlEditControl、CHtmlEditView、CHtmlEditDocクラスなどが追加されている。Windows 2000の印刷ダイアログ・ボックスに対応したCPrintDialogExも用意されている。通常のファイル・オープン用のコモン・ダイアログも、Windows 2000のデフォルトのタイプに変更された。Webサーバ関係の機能として、ISAPIをサポートする、CHttpArg、CHttpArgListといったクラスも追加されている。さらにダイアログ・ボックスにはCDHtmlDialogクラスが利用でき、DHTMLベースのダイアログ・ボックスを作成できるようになった。

 MFCアプリケーションのプロジェクトをウィザードで作成すると、従来と同様のファイルに加えてマニフェスト(manifest)が生成される。これはリソースデータとして、実行モジュールに組み込まれる。マニフェストはXMLで記述されており、アプリケーションの実行タイプやコモン・コントロールのバージョンなどのアセンブリ情報が記述されている。このマニフェストはWindows XPのビジュアル・スタイル(Visual style)を利用する際に参照される。Windows XPでは、コモンコントールのバージョンが6.0になり、コントロールパネルからテーマを選択することで、ユーザー・インターフェイスを従来のものと、XPから採用された新しいデザインとを切り替えられるようになる。Windows XPのコモンコントロールは従来のバージョン(5.0)も含んでいるので、アプリケーションの対応によって、テーマの切り替えに応じたコントロールのデザインを切り替えられるようになる。

 VS .NETの話題の中心はC#とXML Webサービスのようだが、地味ながらMFCは着実に進化している。

Windows XPのテーマに対応したMFCアプリケーション
左が従来のデザインで、右がXPのテーマに対応したデザイン。MFCベースのアプリケーションはテーマの切り替えに対応する。

■ATL 7.0
  従来のATLでは、軽量のCOMオブジェクト作成のための必要最小限のクラスが提供されていた。ただ現状では、コレクション・クラスやウィンドウ関連の処理にMFCを使う場合も多く、結果的にコンパクトなオブジェクトを作成しにくくなっていた。そのためかMFCで用意されているコレクション・クラスの一部がATLでも実装されている。文字列を扱うCStringはMFCのCStringと同様に扱えるようになった。さらに、配列を扱うCAtlArray、リストを扱うCAtlListなども追加されている。これによって、MFCを使わず、ATLのみでのコンポーネントの作成が容易になっている。また、ATL サーバ作成機能に含まれるクラスも追加されている。新規作成プロジェクトには「ATL サーバ Web サービス」が追加されており、これはWeb サービス用のATL サーバを作成するもので、Validationサポートと後述するステンシル処理機能が省略されているものである。

■ ATLサーバ
  マイクロソフトが公開しているドキュメント類を含め、VS .NETの紹介記事では、マネージド・コードによるアプリケーション開発を大々的に扱っているが、それに混じってなぜかVC++の新機能として「ATL サーバ」も取り上げられている。筆者はこのCLRの仮想環境と、(ある意味では非常に泥臭い)C++のクラス・テンプレートのギャップに違和感を感じていた(たったひとつのアプローチを強制することはせず、あらゆる手段を提供することによってユーザーがどれでも選択できるようにするという、マイクロソフトの全包囲網的な戦略としては理解できるとしても)。ATLサーバというのは、IIS(Internet Information Server)のISAPIを効率よくラップするクラスを作成するための機能である。これは、ASPやASP .NET、CGIといった既存のサーバ側の処理を利用せず、クライアントからのリクエストを直接自前のATLサーバで処理できるようにするものである。この利点はなんといっても、Webサーバ側での高速な処理が期待できることにある。ATLサーバでは、ステンシル処理と呼ばれる機能が用意されている。これはHTMLファイルのテンプレートのようなもので、サーバ・レスポンス・ファイル(.SRF)と呼ばれるファイルに事前に特殊なタグを埋めこんでおく。Webブラウザからのリクエストを受けてATLサーバ(のインスタンス)がステンシルをパースする際にこのタグを見つけると、タグに応じたイベントが発生し、イベントに対応するメンバ関数が呼び出される仕組みになっている。これを使うと、雛形となるHTMLファイルをステンシルとして用意しておき、ダイナミックに生成する部分をATLサーバ側で制御することで、簡単に高速でダイナミックなWebページの生成が行えるようになる。


 INDEX
  [特集]Visual Studio .NETベータ2 オーバービュー
    1.Visual Studio .NETの概要
    2.統合開発環境の概要
    3.作成可能なプロジェクト
    4.Windows FormsとWeb Forms
  5.Visual C++でのアプリケーション作成の変化
    6.Visual Basicでのアプリケーション作成の変化
    7.Webアプリケーション開発環境として見たVS .NETとC#


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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間